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。。 有一种默契叫做我不理你,你就不理我

  • 相关阅读:
    远程服务器git搭建
    Ubuntu安装配置MySQL数据库,Apache,PHP
    html radio check
    opencv 抠图联通块(c接口)
    Vim命令
    二维码
    zTree Jquery eCharts
    Java进阶篇设计模式之二 ----- 工厂模式
    SpringBoot整合Netty并使用Protobuf进行数据传输(附工程)
    SpringBoot整合Jsp和Thymeleaf (附工程)
  • 原文地址:https://www.cnblogs.com/weidaijie/p/9854550.html
Copyright © 2011-2022 走看看