当前位置: 首页 > 面试题库 >

Python-浅表复制,深度复制和常规分配操作之间有什么区别?

柯甫
2023-03-14
问题内容
import copy

a = "deepak"
b = 1, 2, 3, 4
c = [1, 2, 3, 4]
d = {1: 10, 2: 20, 3: 30}

a1 = copy.copy(a)
b1 = copy.copy(b)
c1 = copy.copy(c)
d1 = copy.copy(d)


print("immutable - id(a)==id(a1)", id(a) == id(a1))
print("immutable - id(b)==id(b1)", id(b) == id(b1))
print("mutable - id(c)==id(c1)", id(c) == id(c1))
print("mutable - id(d)==id(d1)", id(d) == id(d1))

我得到以下结果:

immutable - id(a)==id(a1) True
immutable - id(b)==id(b1) True
mutable - id(c)==id(c1) False
mutable - id(d)==id(d1) False

如果我执行深度复制:

a1 = copy.deepcopy(a)
b1 = copy.deepcopy(b)
c1 = copy.deepcopy(c)
d1 = copy.deepcopy(d)

结果是相同的:

immutable - id(a)==id(a1) True
immutable - id(b)==id(b1) True
mutable - id(c)==id(c1) False
mutable - id(d)==id(d1) False

如果我从事分配作业:

a1 = a
b1 = b
c1 = c
d1 = d

那么结果是:

immutable - id(a)==id(a1) True
immutable - id(b)==id(b1) True
mutable - id(c)==id(c1) True
mutable - id(d)==id(d1) True

有人可以解释究竟是什么造成了副本之间的差异吗?它和可变且不可变的对象有关吗?如果是这样,您能给我解释一下吗?


问题答案:

普通赋值操作将简单地将新变量指向现有对象。该文档解释了浅拷贝和深拷贝之间的区别:

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

浅表副本构造一个新的复合对象,然后(在可能的范围内)将对原始对象中引用的对象的引用插入其中。

深层副本会构造一个新的复合对象,然后递归地将原始对象中发现的对象的副本插入其中。

这是一个小示范:

import copy

a = [1, 2, 3]
b = [4, 5, 6]
c = [a, b]

使用常规分配操作进行复制:

d = c

print id(c) == id(d)          # True - d is the same object as c
print id(c[0]) == id(d[0])    # True - d[0] is the same object as c[0]

使用浅表副本:

d = copy.copy(c)

print id(c) == id(d)          # False - d is now a new object
print id(c[0]) == id(d[0])    # True - d[0] is the same object as c[0]

使用深拷贝:

d = copy.deepcopy(c)

print id(c) == id(d)          # False - d is now a new object
print id(c[0]) == id(d[0])    # False - d[0] is now a new object


 类似资料:
  • 本文向大家介绍举例区分Python中的浅复制与深复制,包括了举例区分Python中的浅复制与深复制的使用技巧和注意事项,需要的朋友参考一下 copy模块用于对象的拷贝操作。该模块非常简单,只提供了两个主要的方法: copy.copy 与 copy.deepcopy ,分别表示浅复制与深复制。什么是浅复制,什么是深复制,网上有一卡车一卡车的资料,这里不作详细介绍。复制操作只对复合对象有效。用简单的例

  • 问题内容: 我们已经使用序列化实现了通用的深度复制机制。 需要维护的对象类数量一直在不断发展,这是我们继续使用通用克隆机制的原因。我们没有保持津津乐道的想法,并在200多个班。 不幸的是,Java中的序列化机制相对较慢,当系统处于峰值负载时,我们会遇到问题。 是否有任何建议的方法可以加快速度,或者(如果执行不正确的话)克隆对象的替代方法? 问题答案: 在Hibernate中(特别是在第二级缓存中)

  • 我用经纪人ID的20、21、22创建了3个Kafka经纪人设置。然后我创建了这个主题: 其结果是: 当生产者向主题zeta发送消息“Hello World”时,Kafka首先将消息写入哪个分区? 如果我有8个用户在他们自己的进程或线程中并行地运行,并订阅了zeta主题,那么Kafka如何分配分区或代理来并行地为这些用户服务?

  • 我目前正在学习Scala并运行99个问题(http://aperiodic.net/phil/scala/s-99/),它给P07(http://aperiodic.net/phil/scala/s-99/p07.scala)的解决方案如下所示: 但是当我将更改为或其他方式时,结果似乎没有什么不同。因此,我质疑有什么不同以及他们为什么这样做。

  • 问题内容: 在Go中,以下两个代码段之间存在显着差异: 相对于 问题答案: 不,他们返回的是一样的, 结果: 邮件列表上有一些争论,两者都令人困惑: https://groups.google.com/forum/?fromgroups=#!topic/golang- nuts/GDXFDJgKKSs 需要注意的一件事: new()是获取指向未命名整数或其他基本类型的指针的唯一方法。您可以编写“

  • 问题内容: 您能告诉我Java克隆是什么意思吗?什么是深层复制和浅层复制,请举例说明 问题答案: 我强烈建议阅读有效的Java第二版中的第11项