Python列表可变
我试图用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数组的
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
中的列表。