首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

困扰我 48 小时的深拷贝,今天终于...

浅拷贝 vs 深拷贝✦ 当被拷贝的对象是不可变对象时,例如字符串、无可变元素的元组,浅拷贝和深拷贝没有区别,都是返回被拷贝的对象,即没有发生拷贝。...>>> import copy >>> a = (1, 2, 3) # 元组的元素均为不可变对象 >>> b = copy.copy(a) # 浅拷贝 >>> c = copy.deepcopy(a...>>> import copy >>> a = [1, 2, 3] >>> b = copy.copy(a) >>> c = copy.deepcopy(a) >>> id(a), id(b), id(...>>> import copy >>> a = [1, 2, [3, 4]] >>> b = copy.copy(a) >>> c = copy.deepcopy(a) >>> id(a), id(b)...问题的产生✦ 在了解浅拷贝和深拷贝的区别后,我们回到本文的重点:Config 中的深拷贝为什么不能正常拷贝?答案是 Config 没有实现 __deepcopy__ 魔术方法。

23720
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Python对象的深浅拷贝,你到底变不变

    在Python有个重要的东西,就是对象的深浅拷贝。...我们就称为:'==' vs 'is' == 比较对象之间的值是否相等 is 比较的是对象身份是否相等,它们是否同一个对象 我们一般通过id来是否相等来判断是否同一个对象 a = 10 b = 10 a...对于深拷贝,在python中提供了对应的函数copy.copy() import copy l1 = [1, 2, 3] l2 = copy.copy(l1) t1 = (1, 2, 3) t2 = tuple...(t1) t1 == t2 True t1 is t2 True 元组(1,2,3)只被创建一次,t1和t2同时指向这个元组,反正你看到copy.copy()就是两个True 这里有一个天天来骗小孩的东西...如果你添加一个序列来,我浅拷贝没有指向你新来的对象。我干嘛跟着你变。 l1.append(100)l1的列表新增元素100,不会对l2产生影响,l1和l2是两个不同的对象 如果我在元组加呢???

    38730

    Python深浅拷贝

    本文中重点讲解下Python中的深浅拷贝知识点 内存相关 浅拷贝 深拷贝 ---- 内存相关 赋值和修改内存地址中的数据 查看内存地址id()函数 小数据池机制 整数在程序中的使用非常广泛,Python...v3和v4:在系统中重新开辟了内存 ? == 和is区别 == :比较值是否相等 is:判断内存地址是否相同 ?...浅拷贝copy 不管是浅拷贝还是深拷贝,都会开辟新的内存 浅拷贝只拷贝第一层 # 浅拷贝 # 单层列表 V1 = [1, 2, 3, 4] V2 = copy.copy(V1) # 相当于是开辟新的内存来存储...import copy t1 = (1,2,3,4) t2 = copy.copy(t1) t3 = copy.deepcopy(t1) print(id(t1), id(t2)) print(id(t1...(可变元素) t1 = (1,2,3,[4,5,6]) t2 = copy.copy(t1) t3 = copy.deepcopy(t1) print(id(t1), id(t2)) print(id(

    37210

    python之浅拷贝与深拷贝

    深拷贝 深拷贝是对于一个对象所有层次的拷贝(递归) In [17]: import copy In [18]: c = copy.deepcopy(a) In [19]: id(a) Out[19]...注意:变量e由于用的是深拷贝,所以引用与值都是独立的一份 copy.copy 上面演示了copy.deepcopy的用法,下面看copy.copy的用法: In [40]: a = [1,2,3] In...由于变量e用的是copy.copy(c)的方法,所以只拷贝了列表[a,b]的引用(copy.copy只能拷贝第一层引用),所以变量c与变量e的内存地址是不同的,但当改变[a,b]列表中a列表的值时,发现...实际上列表[a,b]中的两个列表a,b的内存地址还是指向的a与b copy元组时的特点 ?...copy.copy方法在copy时会自动判断copy的对象是可变类型还是不可变类型,如果是不可变类型,那么直接将引用指向copy的对象,如果是可变类型,那么只拷贝第一层的引用,后面的引用不会拷贝

    51720

    ​深度解析Python的赋值、浅拷贝、深拷贝

    深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。 拷贝 就是把原数据复制一份,在复制的数据上随意改动不会影响到其原数据。也就是这里讲的深拷贝。...f = copy.deepcopy(c) 深度拷贝,c 和 f 完全拷贝了父对象及其子对象,两者是完全独立的。...[深浅拷贝理解图1] 拷贝对可变类型和不可变类型的区别 copy.copy() 对于可变类型,会进行浅拷贝。 copy.copy() 对于不可变类型,不会拷贝,仅仅是指向。...copy.deepcopy() 深拷贝对可变、不可变类型都一样递归拷贝所有,对象完全独立 所谓的不可变指的是所指向的内存中的内容不可变。 同一份内存地址,其内容发生了改变,但地址依旧不变。...深拷贝测试 In [71]: a = ([1, 2], [3, 4]) In [72]: b = copy.copy(a) In [73]: c = copy.deepcopy(a) In [74

    4.9K10

    ​深度解析Python的赋值、浅拷贝、深拷贝

    深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。 拷贝 就是把原数据复制一份,在复制的数据上随意改动不会影响到其原数据。也就是这里讲的深拷贝。...f = copy.deepcopy(c) 深度拷贝,c 和 f 完全拷贝了父对象及其子对象,两者是完全独立的。 ?...深浅拷贝理解图1 拷贝对可变类型和不可变类型的区别 copy.copy() 对于可变类型,会进行浅拷贝。 copy.copy() 对于不可变类型,不会拷贝,仅仅是指向。...copy.deepcopy() 深拷贝对可变、不可变类型都一样递归拷贝所有,对象完全独立 所谓的不可变指的是所指向的内存中的内容不可变。...深拷贝测试 In [71]: a = ([1, 2], [3, 4]) In [72]: b = copy.copy(a) In [73]: c = copy.deepcopy(a) In [74

    31520

    深复制与浅复制

    —–而浅复制要分两种情况进行讨论: 1)当浅复制的值是不可变对象(数值,字符串,元组)时和“等于赋值”的情况一样,对象的id值与浅复制原来的值相同。...2)当浅复制的值是可变对象(列表和元组)时会产生一个“不是那么独立的对象”存在。...c=copy.copy(a) >>> id(c) 4367619440 >>> d=copy.deepcopy(a) >>> id(d) 4367619440 当浅复制的值是可变对象(列表,字典)时,改变的值不是...因此自然 a b 的值都变成了 [4, 5, 6]。 搞明白这个之后就要问了,对于一个复杂对象的浅copy,在copy的时候到底发生了什么? ...所以说看这里的origin[2],也就是 [3, 4] 这个 list。根据 shallow copy 的定义,在 cop1[2] 指向的是同一个 list [3, 4]。

    75120

    元组、字典、集合的内置方法,散列表、深浅拷贝学习笔记

    目录 元组内置方法(了解) 元祖的方法 有序or无序 可变or不可变 使用元组的目的 字典内置方法(*****) 使用方法 需要掌握(****) 无序、不可变 散列表 集合的内置方法 常用操作+内置方法...优先掌握(*****) 需要掌握 深浅拷贝 Python 直接赋值、浅拷贝和深度拷贝解析 字典浅拷贝实例 实例 实例 解析 更多实例 元组内置方法(了解) 元组:只可取,不可更改的列表,元组一经创建就写死了...b = copy.deepcopy(a): 深度拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。...更多实例 以下实例是使用 copy 模块的 copy.copy( 浅拷贝 )和(copy.deepcopy ): #!...c = copy.copy(a) #对象拷贝,浅拷贝 d = copy.deepcopy(a) #对象拷贝,深拷贝 a.append(5)

    30020

    一、python学习笔记-基本数据类型-深浅拷贝(一)

    """定义 在Python中对象的赋值其实就是对象的引用。当创建一个对象,把它赋值给另一个变量的时候,python并没有拷贝这个对象,只是拷贝了这个对象的引用而已。...类型,long类型(python3已去除long类型,只剩下int类型的数据))属于对象,不是变量 5、不可变对象:一旦创建就不可修改的对象,包括字符串、元组、数字 6、可变对象:可以修改的对象,包括列表...""" """应用范围 1、切片可以应用于:列表、元组、字符串,但不能应用于字典。 2、深浅拷贝,既可应用序列(列表、元组、字符串),也可应用字典。...(a) print(a) print(b) print(id(a)) print(id(b)) print("=====深拷贝=====") b = copy.deepcopy(a) print(a)...(a) print(a) print(b) print(id(a)) print(id(b)) print("=====深拷贝=====") b = copy.deepcopy(a) print(a)

    25950

    为了 1% 情形,牺牲 99% 情形下的性能:蜗牛般的 Python 深拷贝

    最近使用 Python 一个项目,发现 Python 的深拷贝 copy.deepcopy 实在是太慢了。 相关背景 在 Python 中, 我们有两种拷贝对象的方式:浅拷贝和深拷贝。...浅拷贝和深拷贝都可以在 copy 模块中找到, 其中 copy.copy() 进行浅拷贝操作, copy.deepcopy() 进行深拷贝操作。...import copy class A: def __init__(self): array = [1,2,3] a = A() b = copy.copy(a) c = copy.deepcopy...深拷贝比浅拷贝符合人类的直觉,代价就是深拷贝实在是太慢了。下面代码中,case1 和 case2 是等价的。在我的机器上测试,case1 不到一秒,而 case2 则达到了 十秒。...但作为通用模块,Python 深拷贝必须为了这 1% 情形,牺牲 99% 情形下的性能。

    3.9K50

    Python高级语法

    通过 yield 将函数分割成两部分,yield 上面的语句在 __enter__ 方法中执行,yield 下面的语句在 __exit__ 方法中执行,紧跟在 yield 后面的参数是函数的返回值。...不可变类型的浅拷贝示例代码: import copy # 使用浅拷贝需要导入copy模块 # 不可变类型有: 数字、字符串、元组 a1 = 123123 b1 = copy.copy(a1) #...不可变类型的深拷贝示例代码: import copy # 使用深拷贝需要导入copy模块 # 不可变类型有: 数字、字符串、元组 a1 = 1 b1 = copy.deepcopy(a1) #...= (1, ["李四"]) b4 = copy.deepcopy(a4) # 查看内存地址 print(id(a4)) print(id(b4)) # 元组里面的可变类型子对象也会进行拷贝 print...总结 浅拷贝使用copy.copy函数 深拷贝使用copy.deepcopy函数 不管是给对象进行深拷贝还是浅拷贝,只要拷贝成功就会开辟新的内存空间存储拷贝的对象。

    19930

    【python】 深拷贝和浅拷贝:copy模块、可变对象和不可变对象、其他拷贝方式

    Python赋值操作或函数参数传递传递的永远是对象引用(即内存地址),而不是对象内容。在Python中一切皆对象,对象又分为可变(mutable)和不可变(immutable)两种类型。...Out[11]: (1, 2, ['hello', 'china']) In [12]: b Out[12]: (1, 2, ['hello', 'china']) 【解释一下】:变量a与变量b指向的是相同的元组对象...:变量a与变量b指向的是同一个元组对象,不存在拷贝 ---- (4)当顶层对象是immutable不可变对象时,但子元素存在mutable可变对象(子元素部分mutable) In [11]: a Out...:变量a与变量b指向的是不同的元组对象,同时a[2]与b[2]指向不同的列表对象,所以修改a[2][1]不会影响b[2][1] ---- 其它拷贝方法 (1)列表的复制 列表的复制,有以下三种方式: 列表的...】 【解释】:b/c/d都是a的复制,它们都指向了不同的列表对象,但是没有拷贝子元素,a[2]和b[2]/c[2]/d[2]指向同一个列表,相当于浅拷贝的效果 ---- (2)元组的复制 In [1]:

    1.2K20

    python copy & deepcopy 区别

    Python参数传递采用的肯定是“传对象引用”的方式。实际上,这种方式相当于传值和传引用的一种综合。...如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象——相当于通过“传值”来传递对象。...3.为了简化内存管理,Python通过引用计数机制实现自动垃圾回收功能,Python中的每个对象都有一个引用计数,用来计数该对象在不同场所分别被引用了多少次。...,seq和seq_2这两个变量对应两个不同的存储地址,自然对应不同的值,是毫无关联的,但是在python中确令我们大跌眼镜。...那么再看: >>> m = [1, ['a'], 2] >>> m_1 = m >>> m_2 = copy.copy(m) >>> m_3 = copy.deepcopy(m) >>> m[1].append

    1K30
    领券