zoukankan      html  css  js  c++  java
  • python深浅拷贝

    python深浅拷贝

    一、引言

    在python中,对象赋值实际上是对象的引用。当创建一个对象,然后把他赋值给另外一个变量的时候,python并没有拷贝这个对象,而是拷贝了这个对象的引用。

    针对列表l1=['a','b','c',['d','e','f']]一般有三种方法,分别为:拷贝(赋值)、浅拷贝、深拷贝。

    注意:拷贝、浅拷贝、深拷贝都是针对可变类型数据而言的

    1.1 可变 or 不可变

    id 不变值可变,即在原理的基础上修改,则为可变数据类型;值变id也变,即从新申请一个空间放入新值,则为不可变的数据类型。

    age = 19
    print('first:',id(age))
    age = 20
    print('second:',id(age))
    
    #输出:
    first: 140731004973888
    second: 140731004973920
        
     
    
    
    x = 10
    y = 20
    print('x:', id(x), 'y', id(y))
    x, y = y, x
    print('x:', id(x), 'y', id(y))
    
    
    #输出:
    x: 140731004973600 y 140731004973920
    x: 140731004973920 y 140731004973600
    

    二、拷贝

    如果l2是l1的拷贝对象,则l1内部的任何数据类型的元素变化,则l2内部的元素也会跟着变化,因为可变类型值变id不变。

    l1 = ['a','b','c',['d','e','f']]
    l2 = l1
    l1.append('g')
    
    print(l1)
    
    
    #输出:
    ['a', 'b', 'c', ['d', 'e', 'f'], 'g']
    
    print(l2)
    #输出 :
    ['a', 'b', 'c', ['d', 'e', 'f'], 'g']
    
    
    

    三、浅拷贝

    如果l2是l1的浅拷贝对象,则l1内的不可变元素发生了改变,l2不变。如果l1内的可变元素发生l改变,则l2会跟着改变。

    import copy
    l1 = ['a','b','c',['d','e','f']]
    l2 = copy.copy(l1)
    
    l1.append('g')
    
    print(l1)
    #输出:
    ['a', 'b', 'c', ['d', 'e', 'f'], 'g']
    
    print(l2)
    #输出:
    ['a', 'b', 'c', ['d', 'e', 'f']]
    
    l1[3].append('g')
    
    print(l1)
    #输出:
    ['a', 'b', 'c', ['d', 'e', 'f', 'g'], 'g']
    
    print(l2)
    #输出:
    ['a', 'b', 'c', ['d', 'e', 'f', 'g']]
    

    四、深拷贝

    如果l2 是l1 的深拷贝对象,则l1内的不可变元素发生了改变,l2不变。

    如果l1内的可变元素发生了改变,l2也不会改变,即l2 是永远不会因为l1 的变化而变化的。

    import copy
    l1 = ['a','b','c',['d','e','f']]
    l2 = copy.deepcopy(l1)
    
    l1.append('g')
    
    print(l1)
    #输出:
    ['a', 'b', 'c', ['d', 'e', 'f'], 'g']
    
    print(l2)
    #输出:
    ['a', 'b', 'c', ['d', 'e', 'f']]
    
    l1[3].append('g')
    
    print(l1)
    #输出:
    ['a', 'b', 'c', ['d', 'e', 'f', 'g'], 'g']
    
    print(l2)
    #输出:
    ['a', 'b', 'c', ['d', 'e', 'f']]
    
    

    总结

    • 牢记: 拷贝/浅拷贝/深拷贝 只针对可变数据类型
    • 拷贝: 当lt2为lt的拷贝对象时,lt内的可变类型变化,lt2变化;lt内的不可变类型变化,lt2变化,拷贝就是简单的赋值
    • 浅拷贝:当lt2为lt的浅拷贝对象时,lt内的可变类型变化,lt2变化;lt内的不可变类型变化,lt2不变化,实现用copy.copy() 可变数据的类型中的内置方法.copy()
    • 深拷贝: 当lt2为lt的深拷贝对象时,lt内的可变类型变化,lt2不变化;lt内的不可变类型变化,lt2不变
  • 相关阅读:
    2016.07.24
    这个月
    PL/SQL: numeric or value error: character to number conversion error
    java下double相乘精度丢失问题
    Oracle中实现find_in_set
    oracle中,改变表名和字段名的大小写
    Unknown entity XXX
    Incorrect column count: expected 1, actual 5
    负数的二进制表示
    【Android】Android单例模式及使用单例模式实现自己的HttpClient工具类
  • 原文地址:https://www.cnblogs.com/SkyOceanchen/p/11309432.html
Copyright © 2011-2022 走看看