• Python深拷贝和浅拷贝


    • 浅拷贝就是对于一个对象引用的拷贝,而深拷贝就是对对象资源(具体值)的拷贝
    • 对于不可变对象(字符串、元组,整型)的修改,需要开辟新的空间,此时id发生改变,而对于可变对象(列表,字典等)的修改,不需要开辟新的空间
    • 浅拷贝后的orilist和copylist中的元素都指向了相同的地址。修改不可变对象的时候,就需要开辟新的空间(地址变了),所以orilist和copylist中的字符串内容不一样。但是对于list,修改orilist中的list对象后,copylist中的list内容也随之发生了改变。(因为copylist和orlist的list是指向的同一个对象)
    • 深拷贝无论是对于可变对象还是不可变对象,对于orilist的修改都不会影响到deepcopylist中的内容

    对于一个可变对象(列表)的例子

    注意到 python3 语言, 对象是一个盒子,有具体的地址,而变量名相当于是 "标签",可以贴在盒子上。

    我们需要辨析:nums1 = A 和 nums1[:] = A 的不同之处:

    • nums1 = A # 更改 nums1 这一变量名所指向的对象。让 nums1 变量指向 A 所指向的对象
    • nums1[:] = A # 对 nums1 指向的对象赋值。把 A 变量指向的对象的值逐个 copy 到 nums1 指向的对象中并覆盖 nums1 指向的对象的原来值。
    # 对象在内存中的地址与id一一对应,可以使用 id() 查看并判断是否是同一个对象
    
    nums1 = [1,2,4,0,0] 
    print(id(nums1)) # 140125129895880
    
    A = [1,2,3,4,5]
    print(id(A))     # 140125129856640
    
    nums1[:] = A
    print(id(nums1))) # 140125129895880,  仍是原 list 对象, 只不过这一 list 对象的值发生了改变
    
    # 若不执行 nums1[:] = A, 而执行
    nums1 = A
    print(id(nums1))  # 140125129856640, 不再是之前的那个 list 对象
    
  • 相关阅读:
    队列的链式存储结构实现
    堆栈的链式存储实现
    使用C#改变windows系统本地时间
    oracle 多数值录入校验(分隔符“/”)
    oracle中in和exists的区别
    redis安装 windows版(图形化安装)
    Oracle 返回结果集
    饿了么4年 + 阿里2年:研发路上的一些总结与思考
    Oracle 获取各类时间
    Oracle表中已有数据,修改字段长度
  • 原文地址:https://www.cnblogs.com/MayeZhang/p/13872540.html
Copyright © 2020-2023  润新知