python - 为什么对两个相同列表的操作最终会得到不同的结果?

标签 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

有人能给我解释一下区别吗?

最佳答案

如果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]]

关于python - 为什么对两个相同列表的操作最终会得到不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21240943/

相关文章:

python - .flat 在 numpy 中的意义是什么?

python - 如何在不传递 db 对象的情况下将 Flask 模型从 app.py 中拆分出来?

list - tinymce 和列表项的问题

c++ - 没有默认构造函数的成员对象的初始化列表

c - 结构初始化失败

python - 如何理解卡方列联表

python - 如何使用 easy_install 为 Python 2.7 的 Apple 版本安装 pycairo

r - 在嵌套列表上使用 `as.data.frame` 时的列名

python - 如何从比值列表长的键列表中制作字典

c++ - c++对象中静态变量的默认初始化值是多少?