Ann*_*ine 2 python equality initialization list
我有一个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
Run Code Online (Sandbox Code Playgroud)
这给了
[[2, [0]], [2, [0]]] # test1
[[2, [0]], [[0], [0]]] # test2
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释一下这个区别吗?
如果x
是列表,
x * 2
Run Code Online (Sandbox Code Playgroud)
返回列表中相同元素的两倍.
由于列表是通过引用传递的,这意味着:
>>> A = 2 * [[0]]
>>> B = [[0], [0]]
Run Code Online (Sandbox Code Playgroud)
实际上不具有相同的结构:既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]]
Run Code Online (Sandbox Code Playgroud)
而:
>>> B[0] == B[1]
True
>>> B[0] is B[1]
False
>>> B[0].append(1)
>>> B
[[0, 1], [0]]
Run Code Online (Sandbox Code Playgroud)