Variable assignment and modification (in python)
当我把这个剧本(PythonV2.6):
1 2 3 4 5 6 7 | a = [1,2] b = a a.append(3) print a >>>> [1,2,3] print b >>>> [1,2,3] |
我希望
python中的内存管理涉及包含所有python对象和数据结构的私有堆内存位置。
python的运行时只处理对对象的引用(这些对象都位于堆中):python堆栈上的内容总是引用其他地方的值。
1 | >>> a = [1, 2] |
1 | >>> b = a |
1 | >>> a.append(3) |
这里我们可以清楚地看到,变量
您可以使用
1 2 3 4 | >>> a is b >>> True >>> id(a) == id(b) >>> True |
所以,在这种情况下,您必须明确要求一个副本。完成之后,两个不同的列表对象之间将不再有连接。
1 2 3 | >>> b = list(a) >>> a is b >>> False |
python中的对象是通过引用存储的,您没有将
要按值模拟分配,您可以制作类似这样的副本:
1 2 3 4 5 | import copy b = copy.copy(a) # now the code works as"expected" |
请注意,这有性能缺点。
对于数组,有一种特殊的方法依赖于切片:
1 2 3 | b = a[:] # code also works as expected here |
更新–除此之外,对于某些对象,您可以使用构造函数,这包括列表:
1 | b = list(a) |
您可能需要查看此链接。这里的问题是
1 2 | a = [1,2] b = list(a) |
简短的回答-指针。
当您键入
当您执行
所以当你做
如果您只想将列表A的内容复制到B,而不是将B作为指向A的指针:
1 | b = a[:] |
使用slice运算符将列表的内容复制到b中,这样您的示例将变成:
1 2 3 4 5 6 7 | a = [1,2] b = a[:] a.append(3) print a >>>> [1,2,3] print b >>>> [1,2] |