赞
踩
这个问题是由python选择通过引用传递列表的事实引起的.
通常,变量按“值”传递,因此它们独立运行:
>>> a = 1
>>> b = a
>>> a = 2
>>> print b
1
但是,由于列表可能会相当大,而不是将整个列表移动到内存之外,Python选择使用引用(C语言中的“指针”).如果您将另一个变量分配给另一个变量,则只需为其分配引用.这意味着你可以有两个变量指向内存中的相同列表:
>>> a = [1]
>>> b = a
>>> a[0] = 2
>>> print b
[2]
所以,在你的第一行代码中你有4 * [0].现在[0]是指向内存中值0的指针,当你乘以它时,你会得到四个指针到内存中的相同位置.但是当您更改其中一个值时,Python知道指针需要更改以指向新值:
>>> a = 4 * [0]
>>> a
[0, 0, 0, 0]
>>> [id(v) for v in a]
[33302480, 33302480, 33302480, 33302480]
>>> a[0] = 1
>>> a
[1, 0, 0, 0]
当您将此列表乘以时,会出现问题 – 您将获得列表指针的四个副本.现在,当您更改一个列表中的一个值时,所有四个更改在一起:
>>> a[0][0] = 1
>>> a
[[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]
解决方案是避免第二次乘法.一个循环做这个工作:
>>> some_list = [(4 * [0]) for _ in range(4)]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。