我试图了解何时在Python中复制对象。
简单的案例是显式复制,例如:
A = [ 1,2,3 ]
B = list(A) # this is a copy of A
是否存在隐式复制对象的情况?例如,一些语言使用"传递值"将复制用作函数参数的对象(我知道在Python中不是这种情况)。 Python中是否有隐式副本的例子?
答案 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()
在你的例子中没有做任何特别的事。
返回一个列表,其项目与其相同且顺序相同 iterable的项目。 iterable可以是序列,也可以是容器 支持迭代或迭代器对象。如果iterable已经是a 列表,制作并返回副本,类似于iterable [:]。对于 实例,list('abc')返回['a','b','c']和列表((1,2,3)) 返回[1,2,3]。如果没有给出参数,则返回一个新的空列表, []。