• python


    前言

    在Python中一切皆对象,任何对象都有三个属性:唯一标识、类型、值。

    id() ,是Python的一个内置函数,返回对象的唯一标识,用于获取对象的内存地址。

    对于某个对象,如何创建它的拷贝,就是说如何创建与该对象具有相同值的另外一个对象?

    L1 = [[1, 2], 9]
    L2 = L1[:]  # 使用切片
    print(L2)  # [[1, 2], 9]
    

    判断 L1 和 L2 是否使用了相同的内存地址。

    L1 = [[1, 2], 9]
    L2 = L1[:]
    print(L2)  # [[1, 2], 9]
    
    print("L1内存地址:%s" % id(L1))  # 3757064
    print("L2内存地址:%s" % id(L2))  # 31379592
    

    由此可见,L1和L2使用了不同的内存地址。


    判断 L1 和L2 中对应的两个元素引用的列表对象是否一样

    L1 = [[1, 2], 9]
    L2 = L1[:]
    print(L2)  # [[1, 2], 9]
    print("L1[0]内存地址:%s" % id(L1[0]))  # 1856008
    print("L2[0]内存地址:%s" % id(L2[0]))  # 1856008
    
    print("L1[1]内存地址:%s" % id(L1[1]))  # 8791123393856
    print("L2[1]内存地址:%s" % id(L2[1]))  # 8791123393856
    

    列表 L1 和 L2 中的整数对象的内存地址是一样的。

    浅拷贝
    对于某个对象,虽然创建了与该对象具有相同值的另外一个对象,但是这两个对象内部嵌套的对应子对象全部都是同一个对象。就是说外部进行了拷贝,内部没有进行拷贝。


    总结

    以下方式得到的拷贝都是浅拷贝:
    1、切片操作
    2、调用列表、字典、集合的操作 copy
    3、调用标准库模块copy中的copy

    L2 = L1.copy()
    L2 = list(L1)
    L2 = copy.copy(L1)
    
    得到的结果都是一样的
    

    不可变对象: 字符串、元祖、整数等
    可变对象:列表、字典

    修改列表对象:

    L1 = [[3, 6], 8]
    L2 = L1[:]
    
    L1[0][1] = 7
    L1[1] = 9
    print(L1)  # [[3, 7], 9]
    print(L2)  # [[3, 7], 8]
    

    总结:

    1、对不可变对象拷贝时,浅拷贝不开辟新空间,相当于赋值操作。
    2、浅拷贝在拷贝时,只会copy一层,在内存中开辟一个空间,存放这个copy的列表。更深的层次并没有copy,即第二层用的都是同一个内存。
    3、可变对象浅拷贝时,只拷贝第一层中的引用。

    ------分界线------

    成功的背后,是做 难 而正确的事,
    什么是正确的事?
    呐 像这, 读书,写文章。
    
  • 相关阅读:
    Foundation与Core Foundation内存管理基本原则简述
    Quartz2D 图像处理
    XCode中的特殊快捷键图标
    UITableView的编辑模式
    Cocoa框架中的内存分区
    Cocoa 框架为什么采用两阶段的方式来创建对象?
    IOS中的内存不足警告处理(译)
    Caching和Purgeable Memory (译)
    3年后,我回来了
    POJ3632 Optimal Parking
  • 原文地址:https://www.cnblogs.com/wwho/p/15472550.html
Copyright © 2020-2023  润新知