zoukankan      html  css  js  c++  java
  • python直接赋值、浅拷贝、深拷贝的区别

    一:直接赋值

    赋值,就是对象的引用,给对象起别名。

    i = 8
    j = i
    print("值是:",i, "地址:",id(i))
    print("值是:",j, "地址:",id(j))

    输出如下:

    值是: 8 地址: 1639640400
    值是: 8 地址: 1639640400

    i 是一个int类型的对象,j 是指向 i 变量对应的对象,其实是内存地址。可以看到,j和i的值和地址都是一样的,

    b = a: 赋值引用,a 和 b 都指向同一个对象。

    二:浅拷贝

    拷贝父对象,不会拷贝对象的内部的子对象。

    a = [1,2,[3,4,5,6]]
    b = a.copy()
    
    print(a, "	", id(a), id(a[2]))
    print(b, "	", id(b), id(b[2]))
    
    a[2].append("abc")
    print(a)
    print(b)

    输出如下:可以看到,a和b的内存地址不一样,但a[2]和b[2]的内存地址是一样的,说明指向的是同意个对象,对父对象进行操作,会印象拷贝对象。

    [1, 2, [3, 4, 5, 6]]      2091843623432 2091843623368
    [1, 2, [3, 4, 5, 6]]      2091843623752 2091843623368
    [1, 2, [3, 4, 5, 6, 'abc']]
    [1, 2, [3, 4, 5, 6, 'abc']]

    b = a.copy(): 浅拷贝, a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。

    三:深拷贝

    copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。

    import copy
    a = [1,2,[3,4,5,6]]
    b = copy.deepcopy(a)
    
    print(a, "	", id(a), id(a[2]))
    print(b, "	", id(b), id(b[2]))
    
    a[2].append("abc")
    print(a)
    print(b)

    输出如下:可以看到,这一次a和b的内存地址也不一样了,且对父对象进行操作,不会印象拷贝对象。

    [1, 2, [3, 4, 5, 6]]      2143840475656 2143840475592
    [1, 2, [3, 4, 5, 6]]      2143840475976 2143840475912
    [1, 2, [3, 4, 5, 6, 'abc']]
    [1, 2, [3, 4, 5, 6]]

    b = copy.deepcopy(a): 深度拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。

    参考文章:https://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html

    ***************不积跬步无以至千里***************

  • 相关阅读:
    不一样的抽象工厂模式(设计模式七)
    不一样的工厂模式(设计模式六)
    asp .net core 静态文件资源
    asp .net core 中间件
    平时写文档的文档要求
    mysql 悲观锁和乐观锁(二)
    Java实现 LeetCode 836 矩形重叠(暴力)
    Java实现 LeetCode 834 树中距离之和(DFS+分析)
    nmon数据采集参数
    Linux安装iostat命令
  • 原文地址:https://www.cnblogs.com/liangshian/p/11789265.html
Copyright © 2011-2022 走看看