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

  • 相关阅读:
    Codeforces 1045C Hyperspace Highways (看题解) 圆方树
    Codeforces 316E3 线段树 + 斐波那切数列 (看题解)
    Codeforces 803G Periodic RMQ Problem 线段树
    Codeforces 420D Cup Trick 平衡树
    Codeforces 295E Yaroslav and Points 线段树
    Codeforces 196E Opening Portals MST (看题解)
    Codeforces 653F Paper task SA
    Codeforces 542A Place Your Ad Here
    python基础 异常与返回
    mongodb 删除
  • 原文地址:https://www.cnblogs.com/ctztake/p/8194275.html
Copyright © 2011-2022 走看看