美文网首页
python 引用 赋值 浅拷贝 深拷贝

python 引用 赋值 浅拷贝 深拷贝

作者: Arale_zh | 来源:发表于2018-12-04 14:56 被阅读0次

    首先了解一下引用 对象 赋值

    a = 1  # 1为一个对象,a是引用,即引用对象的内存地址 
    

    注意: python已经定义好的小整数池等,当没有引用指向对象时,会被内存机制回收等知识

    • 赋值,copy,deepcopy
    from copy import copy,deepcopy
    '''
    a是引用,[1,2,[3]]是对象
    可变类型:可以改变对象的内容,引用的内存地址不变
    不可变类型:不能改变对象的内容,只能将其引用指向另一个内存地址
    '''
    a = [1,2,[3]]
    
    b = a # 引用,即同用一个id地址,随a变化
    a_copy = copy(a)
    a_deepcopy = deepcopy(a)
    
    print(b,a_copy,a_deepcopy) # [1, 2, [3], 4] [1, 2, [3]] [1, 2, [3]]
    
    a.append(4)
    print(b,a_copy,a_deepcopy) # [1, 2, [3], 4] [1, 2, [3]] [1, 2, [3]]
    
    a[2].append(5)
    print(b,a_copy,a_deepcopy)  # [1, 2, [3, 5], 4] [1, 2, [3, 5]] [1, 2, [3]]
    '''
        不可变类型--无论是赋值,还是深浅拷贝,都是指向对元数据的id地址,当元数据改变,指向另一个新id地址,
        可变类型--赋值是对原对象地址的引用,深浅拷贝都会产生新对象,改变元数据,不会对深浅拷贝产生影响,但是对于浅拷贝,如果对象中还存在可变类型,即是引用地址,而不是一个新的对象。
    '''
    

    总结:
    1. 深浅拷贝都会产生新对象,指向新的内存地址
    2. 赋值,不可变类型产生新对象,可变类型指向元数据的内存地址
    3. 浅拷贝,只是对最外层产生新对象,对其中的可变类型为引用其内存地址。改变元数据的可变部分,还是会产生影响。

    1. 深拷贝,即完完全全产生一个新对象,改变元数据,不会对其产生影响。
    • 最后附一张图,便于理解和记忆 copy&deepcopy.jpg

    相关文章

      网友评论

          本文标题:python 引用 赋值 浅拷贝 深拷贝

          本文链接:https://www.haomeiwen.com/subject/olkmcqtx.html