Python列表可变

时间:2018-10-29 22:55:54

标签: python list android-listview mutable primitive-types

我正在尝试使用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]]

3 个答案:

答案 0 :(得分:1)

所有评论都很棒。

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的更多信息

答案 1 :(得分:1)

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

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

您正在将tmp放在arr列表中,从而给您arr = [tmp],可以将其扩展为arr = [[1,2]]。但这里的巧妙之处在于,您可以通过[1,2]变量维护对列表的引用temp。因此,当您附加temp时,将附加arr中的相同列表。

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

答案 2 :(得分:0)

那是因为cdcd都指向同一个对象。 只需一步一步检查即可:

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

First print statement Second print statement

您可以使用内置的tmp手动进行检查

arr[0]