我想要实现的是将一个小的2D列表插入到一个大的列表中(我使用的是Python 2.7.3)。
为什么我会为var1
和var2
获得不同的结果?
def modify(foo):
small = [[1]*2]*2
for y, line in enumerate(small):
foo[y+1][1:3] = line
return foo
var1 = [[0]*4]*4
var2 = [
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]]
print modify(var1)
print modify(var2)
# Result:
# var1 = [
# [0, 1, 1, 0],
# [0, 1, 1, 0],
# [0, 1, 1, 0],
# [0, 1, 1, 0]]
#
# var2 = [
# [0, 0, 0, 0],
# [0, 1, 1, 0],
# [0, 1, 1, 0],
# [0, 0, 0, 0]]
答案 0 :(得分:6)
通过使用[[0]*4]*4
,您实际上创建了一个列表([0]*4
)并引用了四次。
>>> var1 = [[0]*4]*4
>>> var1
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
>>> var1[0][0] = 2
>>> var1
[[2, 0, 0, 0], [2, 0, 0, 0], [2, 0, 0, 0], [2, 0, 0, 0]]
>>> var1[0] is var1[1]
True
如果用变量
替换内部内容,则会更清楚一些>> inner = [0]*4
>> var1 = [inner, inner, inner, inner]
>>> var1
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
>>> inner[0] = 1
>>> var1
[[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]
答案 1 :(得分:2)
[0]*4
会创建[0, 0, 0, 0]
,但[[0,0,0,0]]*4
会创建一个包含[0,0,0,0]
浅表副本的列表。这意味着,所有内部列表都是相同的。