我碰到了一段代码,乍一看似乎毫无意义。但我意识到这可能有一些未知的含义,我不知道,因为Python不是我最熟悉的语言。
import copy
node = copy.copy(node)
阅读副本的文档说明
copy.copy(x)返回x的浅表副本。
浅拷贝构造一个新的复合对象然后(到 尽可能地将引用插入到找到的对象中 原来。
这段代码有什么用吗?正在复制的节点是从对象的场景列表中获取的。它是否只创建了类的根级别的副本,因此它可以更改变量(名称)但不影响列表中的原始文件?节点类包含多个节点子节点。
copy.copy(node)
与node = node
的区别如何构建一个新对象而另一个是简单指向同一个对象吗?
答案 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变量都绑定到内存中的某些对象。
- 这段代码可以做什么吗?
醇>
是的,确实如此。 实际上它会在内存中使用新名称创建一个新对象。
- 醇>
copy.copy(node
)与node = node
的区别?
通过赋值,您可以获得同一对象的不同名称。
因此,如果您确实需要copy
,则应使用shallow
或deep
副本。
示例:
>>> x = [1]
>>> id(x)
35964488
>>> y = x
>>> id(y)
35964488
>>> z = x[:]
>>> id(z)
35964768
因此x
和y
具有相同的id
,而z
则有所不同。
同样在这里:
>>> import copy
>>> c = copy.copy(x)
>>> id(c)
35985168
>>> id(x)
35964488
引用关于shallow
和deep
副本的文档:
浅层和深层复制之间的区别仅与之相关 复合对象(包含其他对象的对象,如列表或 类实例):
浅复制构造一个新的复合对象,然后(尽可能)将对它的引用插入到找到的对象中 原来。
深层复制构造一个新的复合对象,然后递归地将复制到其中的对象中插入 原始
答案 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 < /强>