Crossin的编程教室

标题: 大神请进!函数执行顺序的问题!困扰很久了! [打印本页]

作者: pylearner    时间: 2018-10-24 22:06
标题: 大神请进!函数执行顺序的问题!困扰很久了!
第一个:
li = [x for x in range(3)]
print(li)

li1 = []
for ii in range(3):
    li2 = []
    for i in li:
        li2.append(i)
    li1.append(li2)
print(li1)
output : [0, 1, 2][[0, 1, 2], [0, 1, 2], [0, 1, 2]] 非常清晰
第二个
li = [x for x in range(3)]
print(li)

li1 = []
for ii in range(3):
    li2 = []
    for i in li:
        li2.append(i)
        li1.append(li2)
print(li1)
outpu:[0, 1, 2][[0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]
我想象中的输出应该是: [[0, ], [0, 1, ], [0, 1,2], [0,], [0, 1,], [0, 1, 2], [0,], [0, 1,], [0, 1, 2]]请问为什么 li1.append(li2)  这条命令是在li2 变成 [0, 1, 2] 之后才开始执行的呢?


作者: crossin先生    时间: 2018-10-26 00:59
因为你添加的是 li2 这个引用。
并不是执行顺序的问题,你把print加到你append的位置,一样可以看到变化

但你3次添加的都是同一个东西,然后你最后才print,当然都是0 1 2 了

看看这篇 http://bbs.crossincode.com/forum.php?mod=viewthread&tid=6632

作者: pylearner    时间: 2018-11-6 00:53
谢谢老师!
作者: pylearner    时间: 2018-11-6 01:39
crossin先生 发表于 2018-10-26 00:59
因为你添加的是 li2 这个引用。
并不是执行顺序的问题,你把print加到你append的位置,一样可以看到变化

crossin 老师, 不知道我这样理解是不是对的: li1.append(li2)之中的li2只是一个标签,它的对象从[0] 变到 [0, 1] 到[0, 1, 2], 所以每轮循环最终[li2, li2, li2] 就变成3个[0, 1, 2]
作者: crossin先生    时间: 2018-11-6 16:03
pylearner 发表于 2018-11-6 01:39
crossin 老师, 不知道我这样理解是不是对的: li1.append(li2)之中的li2只是一个标签,它的对象从[0] 变 ...

是,可以这么理解




欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5