为什么new_list必须放在for循环中以防止全局变化?

时间:2016-11-16 23:06:13

标签: python list python-3.x

有人告诉我这两个街区之间的区别吗?我很难弄清楚为什么第二个只在本地更改嵌套列表,而第一个更改全局。在我看来他们做同样的事情。

my_list = [ ] 
new_list = [0, 0, 0 ]## outside the loop
for index in range(5):
    my_list.append(new_list)
my_list[0][1] = 5
print(my_list)

## result
[[0, 5, 0], [0, 5, 0], [0, 5, 0], [0, 5, 0], [0, 5, 0]]


my_list = [ ] 
for index in range(5):
    new_list = [0, 0, 0 ] ## inside the loop
    my_list.append(new_list)
my_list[0][1] = 5
print(my_list)
## result
[[0, 5, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]

1 个答案:

答案 0 :(得分:1)

因为在for循环内,new_list得到重新定义,所以每次迭代都会有效地引用不同的列表对象。

打印第二种情况的id s显示:

print(*map(id, my_list))  # Notice the different ids
140609203176456 140609194670088 140609194608840 140609212158216 140609194670152

在循环外,您追加相同的列表对象,相同的引用。通过所有参考文献都可以看到变化。

在这种情况下打印id s表示存在相同的id(即相同的列表):

print(*map(id, my_list))  # same id.
140609194670088 140609194670088 140609194670088 140609194670088 140609194670088