问题描述
|
这个问题已经在这里有了答案:
解决方法
假设
a
是一些python对象。那么ѭ1等于[a,a,a,a]。这意味着取决于“ 0”是否可变。数字,字符串和元组不是,所以如果a
是此类对象之一(本例中为0
),那么您将获得4个可独立更改的副本。列表,字典和集合是可变的,在这种情况下,您仅获得对同一对象的4个引用,在这种情况下,列表为“ 5”。利用这些知识,您将看到可以执行以下操作:
M = [[0] * 4 for i in range(4)]
得到你想要的
, 当您将这些列表相乘时,Python会通过引用复制它们,而不是创建全新的对象。
一个简单的示例可能会有所帮助,显示按引用复制的情况:
>>> pie = [\'apple\',\'cherry\',\'pecan\']
>>> pie_copy = pie
>>> pie_copy[0] = \'banana\'
>>> pie
[\'banana\',\'pecan\']
>>> pie is pie_copy
True
>>> new_pie = [\'banana\',\'pecan\']
>>> pie is new_pie
False
以pie_copy和pie指向同一列表的相同方式,通过乘积构建列表时,所有副本均指向同一列表。
在第二个使用ѭ8和列表理解的代码段中,您并没有获得一个列表并复制了多次。理解中的每个迭代都将创建一个新列表,因此您不会遇到相同的按引用复制问题。
, 因为在这里M=[[0]*4]*4
您在对象上创建链接。
类似于
>>> a = [0,0]
>>> b = [a,a,a]
>>> b
[[0,0],[0,0]]
>>> a[1] = 1
>>> b
[[0,1,0]]
>>>
我指的是UPD链接参考,如果造成混淆,请抱歉