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

2024-04-26 07:48:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图理解Python何时复制对象。你知道吗

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

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

是否存在隐式复制对象的方案?例如,一些使用“按值传递”的语言将复制用作函数参数的对象(我知道Python中不是这样)。在Python中有这样的隐式复制的例子吗?你知道吗


Tags: of对象语言is方案情况函数参数this
3条回答

希望它能更好地说明代码中发生了什么:

>>> 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的原因。但是,这两个列表的内容是相同的

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

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

从技术上讲,没有复制发生。添加到a时,实际上是在创建一个新对象,并将变量名“a”赋给它,而变量“b”继续引用原始字符串。你知道吗

就函数而言,在传递的变量中不会发生复制;但是,相同的规则适用于可变参数和不可变参数。如果要传递一个不可变对象,任何更改都只会影响本地“copy”。你知道吗

list()在您的示例中没有做任何特殊的事情。你知道吗

list(iterable):

Return a list whose items are the same and in the same order as iterable‘s items. iterable may be either a sequence, a container that supports iteration, or an iterator object. If iterable is already a list, a copy is made and returned, similar to iterable[:]. For instance, list('abc') returns ['a', 'b', 'c'] and list( (1, 2, 3) ) returns [1, 2, 3]. If no argument is given, returns a new empty list, [].

相关问题 更多 >