美文网首页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之深浅拷贝

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