什么时候在Python中复制对象?

时间:2014-07-26 03:07:16

标签: python python-2.7 copy

我试图了解何时在Python中复制对象。

简单的案例是显式复制,例如:

A = [ 1,2,3 ]
B = list(A) # this is a copy of A

是否存在隐式复制对象的情况?例如,一些语言使用"传递值"将复制用作函数参数的对象(我知道在Python中不是这种情况)。 Python中是否有隐式副本的例子?

3 个答案:

答案 0 :(得分:0)

希望它能更好地说明代码中发生的事情:

>>> a = object()
>>> b = object()
>>> A = [a, b]
>>> B = list(A)
>>> A
[<object object at 0x1002b7090>, <object object at 0x1002b70a0>]
>>> B
[<object object at 0x1002b7090>, <object object at 0x1002b70a0>]
>>> A is B
False

您可以看到list()实际上是基于A创建列表的新实例。这就是A is B返回false的原因。但是两个列表的内容是相同的

答案 1 :(得分:-1)

实际上,任何不可变对象的间接赋值都可以视为副本。例如:

a = "abc"
b = a
a += "def"
print b
--> "abc"

从技术上讲,没有发生复制。当你添加到a时,你实际上是在创建一个新对象并分配变量名称&#34; a&#34;变量&#34; b&#34;继续引用原始字符串。

就函数而言,传递的变量中没有复制;但是,相同的规则适用于可变和不可变的参数。如果您要传递一个不可变对象,任何更改都只会影响本地&#34;复制&#34;。

答案 2 :(得分:-2)

list()在你的例子中没有做任何特别的事。

  

list(iterable)

     

返回一个列表,其项目与其相同且顺序相同   iterable的项目。 iterable可以是序列,也可以是容器   支持迭代或迭代器对象。如果iterable已经是a   列表,制作并返回副本,类似于iterable [:]。对于   实例,list('abc')返回['a','b','c']和列表((1,2,3))   返回[1,2,3]。如果没有给出参数,则返回一个新的空列表,   []。