[随笔重写] Python3 的深拷贝与浅拷贝

1. Python3 关于深浅拷贝的官方文档

2. 先说结论

  • 深拷贝与浅拷贝是对复合对象而言的
  • 深拷贝会构造一个新的复合对象,然后递归地将在原始对象中所有元素的副本对应地写入新复合对象中
  • 浅拷贝会构造一个新的复合对象,然后(在允许的前提下)向其中写入对原始对象的引用

3. 开始分析

  • 复合对象:包含其他对象的对象,如列表、类实例等
  • 模块、方法、堆栈跟踪、堆栈帧、文件、套接字、窗口、数组等不能被拷贝
  • 示例
# 例1

import copy                         # 导入 copy 模块

list1_1 = [0, 1, 2, ['a', 'b']]
list1_2 = list1_1                   # 赋值
list1_3 = list1_1.copy()            # 浅拷贝;同 list1_3 = list1_1[:]
list1_4 = copy.copy(list1_1)        # 浅拷贝
list1_5 = copy.deepcopy(list1_1)    # 深拷贝

# 打印出拷贝后的 list1_1 ~ list1_5
print("list1_1 =", list1_1)
print("list1_2 =", list1_2)
print("list1_3 =", list1_3)
print("list1_4 =", list1_4)
print("list1_5 =", list1_5)
print('-'*40)                       # 分割线

list1_1.append(4)                   # 在 list1_1 末尾添加一个元素 4
list1_1[3].append('c')              # 向 list1_1 中内嵌的列表末尾添加一个元素 'c'

# 打印出更改后的 list1_1 ~ list1_5
print("list1_1' =", list1_1)
print("list1_2' =", list1_2)
print("list1_3' =", list1_3)
print("list1_4' =", list1_4)
print("list1_5' =", list1_5)

>>>

list1_1 = [0, 1, 2, ['a', 'b']]
list1_2 = [0, 1, 2, ['a', 'b']]
list1_3 = [0, 1, 2, ['a', 'b']]
list1_4 = [0, 1, 2, ['a', 'b']]
list1_5 = [0, 1, 2, ['a', 'b']]
----------------------------------------
list1_1' = [0, 1, 2, ['a', 'b', 'c'], 4]
list1_2' = [0, 1, 2, ['a', 'b', 'c'], 4]
list1_3' = [0, 1, 2, ['a', 'b', 'c']]
list1_4' = [0, 1, 2, ['a', 'b', 'c']]
list1_5' = [0, 1, 2, ['a', 'b']]


  • 由例1 可看出
    1. 简单的赋值只是将引用传给新对象,新旧对象除变量名外毫无区别
    2. 原对象中非第一层的可变元素发生变化时,浅拷贝的新对象中的对应元素同步变化
    3. 深拷贝的新对象是一个真正的副本,不随原对象的改变而改变
  • 补充
    1. 拷贝后的新对象占用新的空间,但其内部的元素指向原对象内部对应元素的地址
    2. 原对象中非第一层的不可变元素重新生成时,浅拷贝的新对象中的对应元素保持不变

转载于:https://www.cnblogs.com/yorkyu/p/10328162.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值