list.pop()函数在列表情况下有列表时

时间:2017-10-26 14:35:27

标签: python-3.x list

我在理解以下代码时遇到问题:

这是我编码的一个例子:

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)

这会得到我的预期。 我希望如果有人能告诉我为什么这两个代码给出不同的结果但代码的行为是一样的呢?

2 个答案:

答案 0 :(得分:0)

您感到困惑的原因是Python listsmutable,而immutable数据类型则为strings。这意味着它们由 reference 传递 value - 而不是

所以当你打电话时:

listB.append(listA)

您没有将contents listA list listB添加到reference,您将listA传递到memory所在的位置在 listB 10

这意味着,当您使用listApop()移除memory时,您要更改listAprint的位置。因此,当您listB reference时,它会查找listA的{​​{1}},发现它没有内容(因为popped 10 )和printslist

second code中,你做了不同的事情(即它们与你说的不一样)。在这里,您没有pop来自10的{​​{1}}来listA list,而是将名为empty的变量重新分配给{通过执行以下操作{1}} listA

empty

这会产生不同的结果,因为listlistA = [] 之前的reference仍保留在listA中。因此,当您修改[10] listB时,会为其分配一个新的variable块,用于存储其内容。与此同时,listA的旧内存块保持不变,因此memory保持不变为[10]

答案 1 :(得分:0)

变量(在python中)就像句柄一样。 listA只是您的列表实际所在的其他位置的句柄。 你组装了一个看起来像这样的结构,其中箭头表示"指向":

initial structure

然后,在您的第一个案例中,您通过致电10取出了pop()。但它仍然是同一个盒子,因此它看起来像这样:

pop

但是,在第二种情况下,您所做的就是将A句柄重新分配到新列表[]

reassignment