copy.copy与python

时间:2016-03-29 13:34:48

标签: python

我碰到了一段代码,乍一看似乎毫无意义。但我意识到这可能有一些未知的含义,我不知道,因为Python不是我最熟悉的语言。

import copy
node = copy.copy(node)

阅读副本的文档说明

  

copy.copy(x)返回x的浅表副本。

     

浅拷贝构造一个新的复合对象然后(到   尽可能地将引用插入到找到的对象中   原来。

  1. 这段代码有什么用吗?正在复制的节点是从对象的场景列表中获取的。它是否只创建了类的根级别的副本,因此它可以更改变量(名称)但不影响列表中的原始文件?节点类包含多个节点子节点。

  2. copy.copy(node)node = node的区别如何构建一个新对象而另一个是简单指向同一个对象吗?

3 个答案:

答案 0 :(得分:7)

赋值运算符(=)仅创建对象的引用,并将创建引用相同内存地址的新变量。

复制将在内存中创建一个新对象,然后将变量赋值给它。

例如:

import copy

node = [0, 1]
node2 = node
node3 = copy.copy(node)

node2.append(5)

print(node)
print(node2)
print(node3)

打印出来:

[0, 1, 5]
[0, 1, 5]
[0, 1]

答案 1 :(得分:6)

所有python变量都绑定到内存中的某些对象。

  
      
  1. 这段代码可以做什么吗?
  2.   

是的,确实如此。 实际上它会在内存中使用新名称创建一个新对象。

  
      
  1. copy.copy(node)与node = node的区别?
  2.   

通过赋值,您可以获得同一对象的不同名称。 因此,如果您确实需要copy,则应使用shallowdeep副本。

示例:

>>> x = [1]
>>> id(x)
35964488
>>> y = x
>>> id(y)
35964488
>>> z = x[:]
>>> id(z)
35964768

因此xy具有相同的id,而z则有所不同。

同样在这里:

>>> import copy
>>> c = copy.copy(x)
>>> id(c)
35985168
>>> id(x)
35964488

引用关于shallowdeep副本的文档:

  

浅层和深层复制之间的区别仅与之相关   复合对象(包含其他对象的对象,如列表或   类实例):

     

浅复制构造一个新的复合对象,然后(尽可能)将对它的引用插入到找到的对象中   原来。

     

深层复制构造一个新的复合对象,然后递归地将复制到其中的对象中插入   原始

答案 2 :(得分:2)

首先,Python中有两种类型的对象:可变和不可变。因此,例如,您有列表(列表是可变的):

>>> a = [1,2]
>>> b = a
>>> b[0] = 3
>>> a
[3, 2]

但是,如果您使用简单的副本 - 以这种方式更改b不会影响:

>>> import copy
>>> b = copy.copy(a)
>>> a
[3, 2]
>>> b
[3, 2]
>>> b[0] = 4
>>> b
[4, 2]
>>> a
[3, 2]

还有一件事:如果 a 由其他可变对象组成,则必须使用copy.deepcopy()来获取该对象的完整副本,更改哪些不会影响 a < /强>