Python列表可变

Python列表可变,python,list,android-listview,mutable,primitive-types,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]] 所有的评论都很好 arr.append(tmp) print arr # [[1,2]] 如您所见,结果不是: print arr # [1,2] 因此,arr只保存对tmp数组的

我试图用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]

有关
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
的指针,这是因为
tmp
arr[0]
都指向同一个对象。 只需在此处检查,一步一步:

您可以使用内置的
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]]

arr.append(tmp)
不复制
tmp
引用的列表。它只是将另一个引用添加到
arr
末尾的同一列表中。所以现在
arr[0]
tmp
引用同一个对象。这只是简单Python赋值的基本语义。读“#分配更多内存”会产生误导,不需要分配新内存。一般来说,这不是一个有用的方式来思考问题Python@juanpa.arrivillaga写这篇评论的原因是为了说明,即使在内存重新分配时,两个变量也会一直指向同一个对象。有一些其他的代码< >代码>附录< /Cord>语义,例如像GalangWorksApple。在Python列表中附加的内容就像C++中的引用,而不是按值复制。<代码>附加< /COD> >将已传递的对象附加到列表中,在上面的示例中,没有复制。原始
tmp
对象是添加到列表中的对象,因此当您更改
tmp
时,您将更改当前位于
arr
中的列表。