Python 可变列表

Python List mutable

我正在尝试使用 Python 术语来解释为什么会发生以下情况,有人可以解释为什么 tmp 变成 [[1,2,3]] 而不是 [[1,2]] 吗?

arr = []
tmp = [1,2]
arr.append(tmp)
print arr # [[1,2]]
tmp.append(3)
print arr # [[1,2,3]]

所有评论都很棒。

arr.append(tmp)
print arr # [[1,2]]

如您所见,结果不是:

print arr # [1,2]

所以,arr 只是保存对 tmp 数组的引用。如果我猜你正在寻找:

 arr.extend(tmp)
 print arr # [1,2]

更多关于 difference between append vs. extend list methods in python

arr = [] 是一个空列表,当您通过以下方式将 tmp 附加到它时:

tmp = [1, 2]
arr.append(tmp)

您将 tmp 放入 arr 列表中,从而得到 arr = [tmp],可以扩展为 arr = [[1,2]]。但这里巧妙的是,您通过 temp 变量维护对列表 [1,2] 的引用。因此,当您追加 temp 时,您追加的是 arr 中的相同列表。

进一步说明一下,仅仅因为您将 tmp 附加到 arr 并不意味着结果列表 [[1,2]] 将成为内存中的一个连续块.您将拥有 arr 列表,arr 的第一个元素将是指向列表 tmp.

的指针

那是因为tmparr[0]都指向同一个对象。 只需在此处逐步查看:

http://www.pythontutor.com/visualize.html

First print statement Second print statement

您可以使用 id 内置

手动检查
>>> arr = []
>>> tmp = [1,2]
>>> arr.append(tmp)
>>> id(tmp)
4404123192
>>> id(arr[0])
4404123192
>>> assert id(tmp) == id(arr[0])
>>> tmp.append(3) # allocate more memory (if needs) and add '3' to object (list) with id 4404123192
>>> id(tmp)
4404123192
>>> id(arr[0])
4404123192
>>> print arr
[[1, 2, 3]]