比较赋值、浅拷贝、深拷贝

1、无论是浅拷贝还是深拷贝,拷贝对象后是否会开辟新内存,取决于被拷贝对象的数据类型是否可变,一般来讲,可变的数据类型会开辟新内存,不可变数据类型反之不会开辟新内存,进行内存地址的引用(-5-256以外的大整数池会开辟内存,注:但我本地进行测试比较内存还是一样的,有问题)

2、要在单层、嵌套型对象中逐一比较拷贝

3、浅拷贝和深拷贝的区别主要体现在对嵌套型结构的拷贝上

 1 import copy
 2 
 3 print("================赋值==================")
 4 prototype_lst = [1, 2, 5, [78, 90]]
 5 a = prototype_lst
 6 prototype_lst.append(9)
 7 print(prototype_lst, a)
 8 
 9 print("================浅拷贝==================")
10 prototype_lst.pop(-1)
11 shallow_b = prototype_lst.copy()
12 # 原始列表子对象发生变化,拷贝对象后内部子对象也跟着改变
13 prototype_lst[-1].append(100)
14 print("原始列表:", prototype_lst, "拷贝后列表:", shallow_b)
15 
16 print("================深拷贝==================")
17 deep_b = copy.deepcopy(prototype_lst)
18 # 原始列表子对象发生变化,拷贝对象后内部子对象不变
19 prototype_lst[-1].append(0)
20 print("原始列表:", prototype_lst, "拷贝后列表:", deep_b)
21 
22 # 不可变数据类型的浅拷贝和深拷贝
23 prototype_tuple = (1, 2)
24 shallow_c = copy.copy(prototype_tuple)
25 deep_c = copy.deepcopy(prototype_tuple)
26 print(id(shallow_c) == id(deep_c))

output:

  ================赋值==================
  [1, 2, 5, [78, 90], 9] [1, 2, 5, [78, 90], 9]
  ================浅拷贝==================
  原始列表: [1, 2, 5, [78, 90, 100]] 拷贝后列表: [1, 2, 5, [78, 90, 100]]
  ================深拷贝==================
  原始列表: [1, 2, 5, [78, 90, 100, 0]] 拷贝后列表: [1, 2, 5, [78, 90, 100]]
  True

 总结:嵌套序列的深拷贝内部子对象之所以不会发生改变,我理解就是内部子对象也开辟了一块内存,就是开辟的够彻底也就是深

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:比较赋值、浅拷贝、深拷贝 - Python技术站

(0)
上一篇 2023年4月2日
下一篇 2023年4月2日

相关文章

  • 状态机的实现

    代码里我们经常会出现大量的条件判断,在这种情况下,我们可以实现状态机避免过度使用 有一种方式是把各种状态归为各种状态类 还有一种方式是修改实例的__class__属性 1 “”” 2 状态机的实现 3 修改实例的__class__属性 4 “”” 5 6 7 class Connection: 8 def __init__(self): 9 self.new…

    Python开发 2023年4月2日
    00
  • 工匠回忆(三)

    接上文 7、函数   7.1、长度   7.2、圈复杂度   7.3、函数内代码确保处在同一抽象层内,主流程清晰,不存在穿插的分支   7.4、有状态的函数     7.4.1、全局变量     7.4.2、闭包函数     7.4.3、类     比较偏向于后两者   8、装饰器   装饰器和装饰器模式是两个完全不同的概念   1、三方模块wrapt的引入…

    python 2023年5月6日
    00
  • 在*args, **kwargs上强制规定参数的调用约定

      首先我们要知道任何关于函数调用签名的问题,都和inspect模块有着关系   这个知识点涉及到两个类:               Signature、               Parameter创建一个签名对象,这是个重点 1 from inspect import Signature, Parameter 2 3 params = [Parame…

    Python开发 2023年4月2日
    00
  • 钩子函数

    控制子类的的创建 1、元类   这种方式可能是最常见的也是我们最先知晓的,当然这种方式可能需要我们对元类有比较深入的了解,所以引入了下面的这种方式 2、钩子函数   __init__subclass__,字面意思,父类实现了该双下方法,其后凡是继承他的派生类,都会触发此方法,进行派生类的初始化,实现派生类属性的增加及修改 1 class Meta: 2 de…

    Python开发 2023年4月2日
    00
  • 命名元组

    1、命名元组也叫具名元组   可以通过名称来访问序列中的元素,摆脱对位置的依赖,他本身是一个工厂函数 2、应用1   实例化元组返回的类,其内存占用要比普通类实例要小的多,因为前者实例的属性不通过字典进行管理 1 from collections import namedtuple 2 3 # 返回可实例化的类 4 P = namedtuple(“人”, […

    Python开发 2023年4月2日
    00
  • __call__用法简谈

      python一切皆对象,从是否可调用层面讲,对象又可以分为可调用对象、不可调用对象 在本篇中,类中实现__call__双下方法,即将该类的实例变为可调用对象   普通类未实现__call__的方法,实例是不可调用的,先看 1 class Valley: 2 … 3 4 5 if __name__ == ‘__main__’: 6 v = Valley…

    Python开发 2023年4月2日
    00
  • 德摩根定律

    命题逻辑里的一个法则   定义:非p或非q=非(p且q)   最近在看一本书啊《python工匠……》一个腾讯大佬写的,从这里面了解到这个东西,确实不错 1 1 # 德摩根定律 2 2 def func(): 3 3 a = 10 4 4 b = 20 5 5 if not a < 5 or not b < 10: 6 6 print(a…

    Python开发 2023年4月2日
    00
  • 工匠回忆(二)

    接上文 4、条件分支控制流   避免分支嵌套,异常放在代码片段最前面   4.1、归约函数   4.2、条件表达式的封装避免过长而导致可读性下降   4.3、德摩根定律   4.4、and、or优先级   4.5、or短路效应   4.6、消失的分支     4.6.1、二分查找算法     4.6.2、字典算法   5、异常错误处理   无需多言   6、…

    python 2023年5月4日
    00
合作推广
合作推广
分享本页
返回顶部