3 回答
TA贡献1862条经验 获得超7个赞
您对复制地址的直觉是正确的。像这样思考:
sub_list = [0] * 10
a_list = [sub_list] * 10
该代码实际上与您上面发布的代码等效。这意味着您实际上sub_list在更改的任何元素时都在更改同一列表a_list。您甚至可以通过输入以下内容来确保:
a_list = [[0] * 10] * 10
for n in a_list:
print id(n)
并且每个元素都会显示相同的内容。为了解决这个问题,您应该使用:
a_list = [[0] * 10 for _ in range(10)]
为了为的每个元素创建一个新的子列表a_list。
TA贡献1772条经验 获得超5个赞
列表包含对对象的引用。列表上的乘法仅重复引用(对相同对象!)。尽管这对于不可变的对象(例如整数)来说很好,但是您得到的是对同一list的多个引用。
使用此模式创建单独的列表[[0]*10 for _ in xrange(10)]
。
TA贡献1880条经验 获得超4个赞
为什么不只更改第一个列表?
原因很简单,实际上只有1个列表,而不是10个-正如您已经怀疑的那样:
In [1]: [[0]*10]*10
Out[1]:
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
In [2]: map(id, _)
Out[2]:
[54094624,
54094624,
54094624,
54094624,
54094624,
54094624,
54094624,
54094624,
54094624,
54094624]
如果要创建10个列表,可以通过类似以下的表达式轻松实现
[[0]*10 for x in xrange(10)]
添加回答
举报