zoukankan      html  css  js  c++  java
  • python之拷贝(深浅)

    深浅拷贝

    深浅拷贝分为两部分,一部分是数字和字符串另一部分是列表、元组、字典等其他数据类型。

    数字和字符串

    对于数字字符串而言,赋值、浅拷贝和深拷贝无意义,因为他们的值永远都会指向同一个内存地址。

    复制代码
    # 导入copy模块
    >>> import copy
    # 定义一个变量var1
    >>> var1 = 123
    # 输出var1的内存地址
    >>> id(var1)
    1347747440
    >>> var2 = var1
    # var2的内存地址和var1相同
    >>> id(var2)
    1347747440
    # 浅拷贝
    >>> var3 = copy.copy(var1)
    # var3的内存地址和var1相同
    >>> id(var3)
    1347747440
    # 深拷贝
    >>> var4 = copy.deepcopy(var1)
    # var4的内存地址和var1相同
    >>> id(var4)
    1347747440
    复制代码

    其他数据类型

    对于字典、元祖、列表 而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同的。

    • 创建一个字典var1
    var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}

    赋值

    赋值,只是创建一个变量,该变量指向原来内存地址,如:

    复制代码
    >>> var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}
    >>> var2 = var1
    >>> id(var1)
    1937003361288
    >>> id(var2)
    1937003361288
    复制代码

    如图所示:

    浅拷贝

    浅拷贝,在内存中只额外创建第一层数据

    复制代码
    # 导入拷贝模块
    >>> import copy
    >>> var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}
    # 使用浅拷贝的方式
    >>> var2 = copy.copy(var1)
    # 两个变量的内存地址是不一样的
    >>> id(var1)
    2084726354952
    >>> id(var2)
    2084730248008
    # 但是他们的元素内存地址是一样的
    >>> id(var1["k1"])
    2084726207464
    >>> id(var2["k1"])
    2084726207464
    复制代码

    如图所示:

    深拷贝

    深拷贝,在内存中将所有的数据重新创建一份(排除最后一层,即:python内部对字符串和数字的优化)

    复制代码
    # 导入拷贝模块
    >>> import copy
    >>> var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}
    # 使用深拷贝的方式把var1的内容拷贝给var2
    >>> var2 = copy.deepcopy(var1)
    # var1和var2的内存地址是不相同的
    >>> id(var1)
    1706383946760
    >>> id(var2)
    1706389852744
    # var1和var2的元素"k3"内存地址是不相同的
    >>> id(var1["k3"])
    1706389853576
    >>> id(var2["k3"])
    1706389740744
    # var1和var2的"k3"元素的内存地址是相同的
    >>> id(var1["k3"][1])
    1706383265744
    >>> id(var2["k3"][1])
    1706383265744
    复制代码

    如图所示:

     

    复制代码
    import copy
    
    # 对数字 字符串
    # a = 1
    # b = a
    #
    # print(id(a) == id(b))
    # b = 12
    # print(a, b)
    # print(id(a) == id(b))
    
    
    # a = 'aa'
    # b = copy.copy(a)
    # print(a, b)
    # print(id(a) == id(b))
    #
    # b = 'bb'
    # print(a, b)
    # print(id(a) == id(b))
    
    # c = copy.deepcopy(a)
    # print(a, c)
    # print(id(a) == id(c))
    #
    # c = 'cc'
    # print(a, c)
    # print(id(a) == id(c))
    
    
    # a = [1, 2, 3, 4, 5]
    #
    # b = a
    #
    # b[1] = 5
    # print(a, b)
    # print(id(a) == id(b))
    
    #
    # a = [1, 2, 3, 4, 5, [1, 2]]
    # b = copy.copy(a)
    # print(a, b)
    # print(id(a) == id(b))
    # print(id(a[1]) == id(b[1]))
    # print(id(a[5]) == id(b[5]))
    # b[1] = 10
    # print(a[1])
    # print(id(a[1]) == id(b[1]) )
    #
    # print('----------')
    # print(id(a[5][0]) == id(b[5][0]))
    # b[5][0] = 50
    # print(a[5][0])
    # print(id(a[5][0]) == id(b[5][0]))
    
    
    a = [1, 2, 3, 4, 5, [5, [[1,2],8]], {'a': 'aa'}]
    b = copy.deepcopy(a)
    print(id(a) == id(b))
    print(id(a[3]) == id(b[3]))
    print(id(a[5]) == id(b[5]))
    # b[3] = 20
    # print(a, b )
    print(id(a[5][1][0][1]) == id(b[5][1][0][1]))
    b[5][1][0] = 20
    print(a[5][1][0])

    优秀的深浅拷贝博客https://www.cnblogs.com/fandx/p/10462913.html?tdsourcetag=s_pctim_aiomsg

  • 相关阅读:
    如何轻松的把图片导入execl表格中
    把Execl表格中的数据获取出来保存到数据库中
    zookeeper系列之:独立模式部署zookeeper服务
    zookeeper系列之:zookeeper简介浅谈
    spark-shell启动spark报错
    大数据Hadoop学习之搭建hadoop平台(2.2)
    hbase系列之:独立模式部署hbase
    hbase系列之:初识hbase
    大数据Hadoop学习之搭建Hadoop平台(2.1)
    大数据Hadoop学习之了解Hadoop(1)
  • 原文地址:https://www.cnblogs.com/Xanderzyl/p/10496392.html
Copyright © 2011-2022 走看看