美文网首页Python全栈
11.Python之深浅拷贝

11.Python之深浅拷贝

作者: 免跪姓黄 | 来源:发表于2020-02-07 15:06 被阅读0次

Python中的深浅拷贝

  1. 浅拷贝

    • 浅拷贝只拷贝一个外壳变成自己的,里面的内容是复用的被拷贝对象的。

      list_1 = [1,2,3,[4,5,6,]]
      list_2 = list_1.copy()
      list_1.append(7)
      print(list_1, id(list_1))
      print(list_2, id(list_2))
      '''
      # 输出结果:
      [1, 2, 3, [4, 5, 6], 7] 1341743330048
      [1, 2, 3, [4, 5, 6]] 1341744017920
      '''
      # list_2拷贝的list_1,但当list_1改变列表中元素的时候,list_2却不发生改变,说明两个列表是开辟的不同内存空间,由两个列表的id()值不同,也可看出。
      
      list_1 = [1,2,3,[4,5,6,]]
      list_2 = list_1.copy()
      list_1[0] = 0
      list_1[-1].append(7)
      print(list_1, id(list_1))
      print(list_2, id(list_2))
      print(id(list_1[1]))
      print(id(list_2[1]))
      '''
      输出结果:
      [0, 2, 3, [4, 5, 6, 7]] 1835916030720
      [1, 2, 3, [4, 5, 6, 7]] 1835916718592
      140732296840896
      140732296840896
      '''
      # 列表中的每个索引位置上的元素数据其实记录并不是真正的数据,而是数据的内存地址;当执行list_1.copy()后,会在内存中开辟一个新的空间存储list_2列表,list_2列表中的数据内存地址还会沿用list_1中的数据内存地址,即list_1和list_2中的数据都指向同一内存地址上的数据,因此,list_1和list_2的id()值不同,但列表中元素的id相同。但为什么改变list_1索引0上的值,list_2索引0上的值却不发生改变呢?那是因为list_1索引0上改变的是内存地址而非内存地址中的值。
      
  2. 深拷贝

    • 原则上深拷贝不仅将外壳拷贝出来变成自己的,连里面的内容也都拷贝出来变成自己的。但Python做了一个优化,为了节省内存,将不可变的数据类型沿用同一内存地址上的数据;拷贝的可变数据类型则开辟新的内存空间,产生新的内存地址。

      import copy
      list_1 = [1,2,3,[4,5,6,]]
      list_2 = copy.deepcopy(list_1)
      list_1[-1].append(7)
      print(list_1, id(list_1))
      print(list_2, id(list_2))
      print(id(list_1[1]))
      print(id(list_2[1]))
      '''
      输出结果:
      [1, 2, 3, [4, 5, 6, 7]] 1816231085888
      [1, 2, 3, [4, 5, 6]] 1816231267776
      140732296840896
      140732296840896
      '''
      
  3. 总结

    • 浅拷贝:列表、字典嵌套的可变数据类型是同一个。列表切片数据浅拷贝。
    • 深拷贝:列表、字典嵌套的可变数据类型不是同一个。

相关文章

  • 11.Python之深浅拷贝

    Python中的深浅拷贝 浅拷贝浅拷贝只拷贝一个外壳变成自己的,里面的内容是复用的被拷贝对象的。list_1 = ...

  • 11.python深浅拷贝

    python为拷贝提供了copy模块。提供了两种主要的copy方法,一种是普通的copy,另一种是deepcopy...

  • 2018-08-29

    深浅拷贝 1.根据拷贝内容的不同,分为深浅拷贝 深拷贝:内容...

  • iOS之深浅拷贝

    1.深拷贝和浅拷贝概念 由上面的图我们可以明确地看出:浅拷贝(Shallow copy):是指针复制,它们指向共同...

  • JS之深浅拷贝

    1.深拷贝与浅拷贝的区别 如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,...

  • Java之深浅拷贝

    Java之深浅拷贝 基本类型:拷贝数据的值其他类型:拷贝地址的引用,拷贝出的新对象与原对象共享实例变量,不受访问权...

  • iOS 之深浅拷贝

    1. 深浅copy的本质区别: 深copy: 在拷贝对象自身的时候,将底层数据也进行了复制过去。 浅copy: 只...

  • Python之深浅拷贝

    个人认为这个知识点比较重要,所以单独做了一个文章 Python中的浅拷贝就是对引用的拷贝,深拷贝就是对引用的拷贝,...

  • 深入之深浅拷贝

    一、数据类型 数据类型分为基本数据类型(String,Number,Boolean,Null,Undefined,...

  • python之深浅拷贝

    python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果,其实这个...

网友评论

    本文标题:11.Python之深浅拷贝

    本文链接:https://www.haomeiwen.com/subject/voimxhtx.html