zoukankan      html  css  js  c++  java
  • 别名、浅复制与深复制

    别名

    别名就是起另一个名字,实际上是同一个东西,地址完全一样,改变任意一个的值,另一个会随着改变。

    person_info = ['age: 18', ['beijing', 'wuhan']]
    info_other_name = person_info  # 别名,他们是在同一个地址上,改变任意一个,另外的跟着改变(可以减少不必要的内存开销)
    print id(info_other_name), id(person_info)  # 地址一样
    person_info[0] = 'age: 23'  # 改变原地址年龄,info_other_name也跟着变,因为就是一个东西
    print u'原来的值', person_info
    print u'别名的值', info_other_name

    输出结果

    47750200 47750200
    原来的值 ['age: 23', ['beijing', 'wuhan']]
    别名的值 ['age: 23', ['beijing', 'wuhan']]

    浅复制

    浅复制表示只复制表面一层,再深的层次还是指向他原来的地址。

    import copy
    person_info = ['age: 18', ['beijing', 'wuhan']]
    info_shallow_copy = copy.copy(person_info)  # 浅复制 只复制第一层,其他层还是指向它原来的地址
    print id(info_shallow_copy), id(person_info)  # 地址不一样
    person_info[0] = 'age: 23'  # 此处改年龄,person并没有跟着改变
    person_info[1].remove('wuhan')  # 删除列表里的下一级列表,会跟着改变
    print u'原来的值', person_info
    print u'浅复制的值', info_shallow_copy

    输出结果

    47791200 47769360  # 地址不一样
    原来的值 ['age: 23', ['beijing']] 
    浅复制的值 ['age: 18', ['beijing']]  # 表面上的一层(年龄),独立于原来的值,但往下一层指向的地址还是原来的指向

    深复制

    深复制之后,所有的内容都独立于原变量存在。

    import copy
    person_info = ['age: 18', ['beijing', 'wuhan']]
    info_deep_copy = copy.deepcopy(person_info)  # 深复制 全部都都复制过来,都不会跟着改变
    print id(info_deep_copy), id(person_info)  # 地址不一样
    person_info[0] = 'age: 23'
    person_info[1].remove('wuhan')
    print u'原来的值',person_info
    print u'深复制的值',info_deep_copy

    输出结果

    54781712 54859536
    原来的值 ['age: 23', ['beijing']]
    深复制的值 ['age: 18', ['beijing', 'wuhan']]  # 完全独立于原来的变量
  • 相关阅读:
    qt程序编译错误:could not exec ‘/usr/lib/x86_64-linux-gnu/qt4/bin/qmake’
    安装 yaml-cpp,MP4V2
    安装cmake 和 opencv 4.0.0
    windows系统,boost编译安装
    messageQ 消息队列
    fflush 和 fsync 的区别
    开源一个 PDF 小工具集软件【使用 PDFium 库实现】
    封装 libjpeg 库
    纯 C++ 代码实现的 INI 文件读写类
    C++11 —— 使用 thread 实现线程池
  • 原文地址:https://www.cnblogs.com/huahua12/p/8531017.html
Copyright © 2011-2022 走看看