zoukankan      html  css  js  c++  java
  • python中的赋值、浅拷贝和深拷贝

    1、对于不可变数据类型来说,没有深浅拷贝之分,这些操作都是将变量指向同一个地址空间,两者的id一样,如果对其重新赋值,也只是重新创建了一个对象,替换掉旧的。

    2、对于可变数据类型来说

    2.1 赋值 两者完全指向相同的地址空间id()一样,可变数据类型的改变会导致两者都改变。

    a = [1,2,3,4,[33,44,55]]
    c = a
    print(id(a),id(c))
    print(a,c)
    a[0]="改变"
    print(a,c)
    结果
    2352692648520 2352692648520
    [1, 2, 3, 4, [33, 44, 55]] [1, 2, 3, 4, [33, 44, 55]]
    ['改变', 2, 3, 4, [33, 44, 55]] ['改变', 2, 3, 4, [33, 44, 55]]
    

     2.2 浅拷贝 只拷贝最外面一层数据,无法拷贝第二层。两者只有独立的第一层地址空间,再深层的都指向相同的地址空间

    两者的id()不同,最外层地址空间不同

    import  copy
    a = [1,2,3,4,[33,44,55]]
    b = copy.copy(a)
    a[1]="你好"
    print(id(a),id(b))
    print(a,b)
    a[4][0]="zaoshanghao "
    print(a,b)
    结果
    2764463327880 2764463383048
    [1, '你好', 3, 4, [33, 44, 55]] [1, 2, 3, 4, [33, 44, 55]]
    [1, '你好', 3, 4, ['zaoshanghao ', 44, 55]] [1, 2, 3, 4, ['zaoshanghao ', 44, 55]]
    

     2.3 深拷贝 在内存中所有的数据都重新创建一份,彼此数据内存空间完全独立,互不影响

    import  copy
    a = [1,2,3,4,[33,44,55]]
    b = copy.deepcopy(a)
    a[1]="你好"
    print(id(a),id(b))
    print(a,b)
    a[4][0]="zaoshanghao "
    print(a,b)
    结果
    2427449952904 2427450008072
    [1, '你好', 3, 4, [33, 44, 55]] [1, 2, 3, 4, [33, 44, 55]]
    [1, '你好', 3, 4, ['zaoshanghao ', 44, 55]] [1, 2, 3, 4, [33, 44, 55]]
    

    I can feel you forgetting me。。 有一种默契叫做我不理你,你就不理我

  • 相关阅读:
    获取字符串中指定字符间的字符串
    删除一个xml
    读取文件夹下所有文件名,饼写入xml
    在现有xml增加一个新的节点
    某一时间执行某方法c# 写在global里
    Ubuntu下安装Adobe Flash Player
    Josephus(约瑟夫环)
    html5综合属性图表
    第一步
    框架学习的个人见解
  • 原文地址:https://www.cnblogs.com/weidaijie/p/9854550.html
Copyright © 2011-2022 走看看