我在理解以下代码时遇到问题:
这是我编码的一个例子:
listA=[]
listB=[]
listA.append(10)
print(listA)
listB.append(listA)
print(listB)
listA.pop()
print(listA)
print(listB)
我期待shell打印出以下结果:
[10]
[[10]]
[]
[[10]]
但实际上我得到的是:
[10]
[[10]]
[]
[[]]
我不理解这背后的逻辑。如果我将代码改为:
listA=[]
listB=[]
listA.append(10)
print(listA)
listB.append(listA)
print(listB)
listA=[]
print(listA)
print(listB)
这会得到我的预期。 我希望如果有人能告诉我为什么这两个代码给出不同的结果但代码的行为是一样的呢?
答案 0 :(得分:0)
您感到困惑的原因是Python
lists
为mutable
,而immutable
数据类型则为strings
。这意味着它们由 reference
传递 value
- 而不是。
所以当你打电话时:
listB.append(listA)
您没有将contents
listA
list
listB
添加到reference
,您将listA
传递到memory
所在的位置在 listB
到10
。
这意味着,当您使用listA
从pop()
移除memory
时,您要更改listA
中print
的位置。因此,当您listB
reference
时,它会查找listA
的{{1}},发现它没有内容(因为popped
10
)和prints
空list
。
在second
code
中,你做了不同的事情(即它们与你说的不一样)。在这里,您没有pop
来自10
的{{1}}来listA
list
,而是将名为empty
的变量重新分配给{通过执行以下操作{1}} listA
:
empty
这会产生不同的结果,因为list
与listA = []
之前的reference
仍保留在listA
中。因此,当您修改[10]
listB
时,会为其分配一个新的variable
块,用于存储其内容。与此同时,listA
的旧内存块保持不变,因此memory
保持不变为[10]
。
答案 1 :(得分:0)