为什么两个相同列表上的操作最终会产生不同的结果?

时间:2014-01-20 17:57:04

标签: python list initialization equality

我有一个Python代码,我首先定义两个列表,然后我使它们相同并在它们相同后对它们执行相同的操作 - 但结果不一样:

test1 = [[[0],[0]]]*2
test2 = [[0]]*2

test2[0] = [[0],[0]]
test2[1] = [[0],[0]]

print 'They are identical?:',test1 == test2 # gives True

# Now that test1 == test2 do the same operation on test list 1 and 2:

test1[0][0] = 2
test2[0][0] = 2

print test1
print test2

这给出了

[[2, [0]], [2, [0]]]   # test1
[[2, [0]], [[0], [0]]] # test2

有人可以向我解释一下这个区别吗?

2 个答案:

答案 0 :(得分:5)

如果x是一个列表,

x * 2

返回列表中相同元素的两倍。

由于列表是通过引用传递的,这意味着:

>>> A = 2 * [[0]]
>>> B = [[0], [0]]

实际上不会有相同的结构:A[0]A[1]都指向相同的列表,而B[0]B[1]指向两个不同的名单。

事实上,如果你尝试:

>>> A[0] == A[1]
True
>>> A[0] is A[1]
True
>>> A[0].append(1)
>>> A
[[0, 1], [0, 1]]

虽然:

>>> B[0] == B[1]
True
>>> B[0] is B[1]
False
>>> B[0].append(1)
>>> B
[[0, 1], [0]]

答案 1 :(得分:2)

这个命令

test1 = [[[0],[0]]]*2

相当于这个2:

a = [[0], [0]]
test1 = [a, a]

然后您将值分配给test1[0][0],您正在更改a列表的值。当然test[1]更改为,因为它是a列表

相关问题