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

    python深浅拷贝

    一、引言

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

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

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

    1.1 、可变or不可变

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

    age = 19
    print(f'first:{id(age)}')
    age = 20
    print(f'second:{id(age)}')
    

    first:4384901776 second:4384901808

    二、拷贝

    如果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(12)
    

    ['a','b','c'['d','e','f'],'g']

    三、深拷贝

    如果l2是l1的浅拷贝对像,则l1内的不可变元素发生改变,l2不变;如果l1内的元素发生了改变,则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']]

  • 相关阅读:
    团队项目—第二次冲刺计划
    第一阶段冲刺总结
    团队绩效评估
    回复其他小组对我们的评价
    软件项目评价
    maven 之分模块构建web项目 及 聚合与继承特性
    Log4j 使用总结
    freemarker 总结
    freemarker入门 之 脱离容器实现hello word
    读取txt文件 统计“java”出现的次数(大小写不敏感)
  • 原文地址:https://www.cnblogs.com/luodaoqi/p/11323806.html
Copyright © 2011-2022 走看看