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

    import copy
    
    # 浅拷贝
    print("浅拷贝:")
    a = [1, 2, 3]
    b = a
    a.append(4)
    print(a, "-" * 5, b)
    print(id(a), "=" * 5, id(b))
    print("结论:a、b指向同一内存空间,并没有新开辟空间")
    
    # 深拷贝
    print("*" * 60)
    print("深拷贝:")
    a = [1, 2, 3]
    b = copy.deepcopy(a)
    a.append(4)
    print(a, "-" * 5, b)
    print(id(a), "=" * 5, id(b))
    print("结论:b新建的一内存空间,里面的值即为a指向的内存空间的值")
    
    # 进一步理解拷贝
    print("*" * 60)
    print("进一步理解拷贝:")
    print("浅拷贝:")
    a = [1, 2, 3]
    b = [4, 5, 6]
    c = [a, b]
    d = c
    b.append(7)
    print(c, "-" * 5, d)
    print(id(c), "=" * 5, id(d))
    print("结论:这样的拷贝即浅拷贝,d、c指向同一内存空间")
    
    print("*" * 30)
    print("深拷贝:")
    d = copy.deepcopy(c)
    b.append(8)
    print(c, "-" * 5, d)
    print(id(c), "=" * 5, id(d))
    print("结论:d新建的一个内存空间,内存空间里面呢,又指向了两个新的列表,这两个新的列表里面放的是a、b的值(都是全新的)")
    
    print(" *" * 30)
    print("补充:(这个牛逼了,半深半浅的拷贝)")
    d =copy.copy(c)
    b.append(9)
    print(c, "-" * 5, d)
    print(id(c), "=" * 5, id(d))
    print("结论:d新建了一个内存空间,内存空间里面有两个指针,它呢,"
          "它指向的还是原来的a、b,不是新的a、b(copy.copy()仅仅只对c做了一层判断,元组浅拷贝,列表深拷贝)")
    
    # 拷贝的其他形式
    # 浅拷贝对不可变类型和可变类型的copy不同
    print("*" * 60)
    print("可变类型:")
    a = [1,2,3]
    b = copy.copy(a)
    a.append(4)
    print(a, "-" * 5, b)
    print(id(a), "=" * 5, id(b))
    
    print()
    print("不可变类型(元组):")
    a = (1,2,3)
    b = copy.copy(a)
    print(id(a), "=" * 5, id(b))
    print("结论:可变类型的copy新建的一个内存空间,不可变类型的copy还是指向原来的内存空间")
  • 相关阅读:
    大型运输行业实战_day03_1_基于intellij idea的非maven spring+springMVC+mybatis搭建
    大型运输行业实战_day02_2_数据模型建立
    大型运输行业实战_day02_1_数据库设计与powerDesigner使用
    MySQL 并发控制(锁得使用)
    Oracle 日期减年数、两日期相减
    Oracle 递归拼接字段
    设计模式之适配器模式(结构型)
    设计模式之桥接模式(结构型)
    设计模式之装饰模式(结构型)
    Redis学习笔记之位图
  • 原文地址:https://www.cnblogs.com/tangxlblog/p/9947777.html
Copyright © 2011-2022 走看看