码迷,mamicode.com
首页 > 编程语言 > 详细

Python中的深浅拷贝

时间:2019-06-18 14:32:05      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:数据改变   影响   http   print   tuple   行修改   set   list   也会   

Python中的深浅拷贝

前言:我们在了解深浅拷贝之前首先需要明白的一点知识

  1. 不可变类型数据:不可变类型即指当改变其内元素时,内存空间将会发生变化,比如常见的不可变类型有:str,boolean, int,tuple。

    temp = "哈哈哈"
    ret = temp.replace("哈", "嘿", 2)
    print(temp)      # 哈哈哈
    print(ret)       # 嘿嘿哈
    # 我们可以看到temp的值并没有发生改变,这就是为什么对str数据改变之后需要重新赋值的原因,因为它是不可变类型,只能重新找一个值接收。
  2. 可变类型数据:当改变其内元素时,内存空间不会发生变化,比如常见的可变类型有:list,set,dict。

    lst = [1, 2, 3]
    lst.append(4)
    print(lst)   # [1, 2, 3, 4]
    # 而对可变类型数据进行操作时,因为它是可变类型数据,没有改变原来的内存地址空间,所以不需要重新赋值,可以直接打印
  3. 赋值与深浅拷贝

    # 赋值
    lst = [1, 2, 3, 4]
    lst2 = lst
    lst2.append(5)
    print(lst)   # [1, 2, 3, 4, 5]
    print(lst2)  # [1, 2, 3, 4, 5]
    # 因为lst是可变类型,所以在赋值时是将lst的内存地址赋值给了lst2.也就意味着它们指向了同一个内存空间,所以当其中任意一个对里面的元素进行操作时,另一个也会改动。
    
    # 浅拷贝
    import copy
    lst = [1, 2, 3, ["哈哈", "嘿嘿"]]
    # lst2 = lst.copy()   浅拷贝
    lst2 = copy.copy(lst)    # 浅拷贝,二者任选其一,都是浅拷贝
    print(lst2)  # [1, 2, 3, ["哈哈", "嘿嘿"]]
    lst[3].append("嘻嘻")
    print(lst2)  # [1, 2, 3, ["哈哈", "嘿嘿", "嘻嘻"]]
    # 从中我们可以看到,当进行浅拷贝时,拷贝之后的对象并不是完全和原对象没有关系,当原对象对里面的列表进行修改时,拷贝后的对象里面的列表也跟着修改。这就称为浅拷贝。
    # 当进行浅拷贝时会对里面每个元素进行拷贝,然而当里面有一个可变类型数据时,它这时候就不是拷贝数据本身,而是拷贝的这个可变数据的内存地址,这也就能解释为什么改变原有对象还能对拷贝后的对象产生影响了,因为它们本身还是指向同一个内存地址。
    # 你也可以简单理解浅拷贝:浅拷贝只拷贝第一层。
    
    # 深拷贝
    import copy
    lst = [1, 2, 3, ["哈哈", "嘿嘿"]]
    lst2 = copy.deepcopy(lst)    # 深拷贝
    print(lst2)  # [1, 2, 3, ["哈哈", "嘿嘿"]]
    lst[3].append("嘻嘻")
    print(slt2)  # [1, 2, 3, ["哈哈", "嘿嘿"]]
    # 深拷贝即完全拷贝,不管里面的元素是否含有可变类型数据,拷贝的就是数据本身,而不是对象内存地址。
  4. 插图

    浅拷贝

技术图片

深拷贝

技术图片

tips:图画的很糙,可能你们看了也不懂,但我就是要画 ~~

Python中的深浅拷贝

标签:数据改变   影响   http   print   tuple   行修改   set   list   也会   

原文地址:https://www.cnblogs.com/wangyueping/p/11044739.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!