当前位置:首页>python>Python之浅拷贝与深拷贝

Python之浅拷贝与深拷贝

  • 2026-09-02 20:32:31
Python之浅拷贝与深拷贝

第六章 浅拷贝与深拷贝

此篇的知识点如果理解了,对后续的学习有很好的帮助,请不熟悉的道友多看多练多思考。

1.概念

为什么要拷贝?

  • 赋值语句x = y,只是让x指向和y一样的对象。
  • 如果x和y指向的是一个可变对象,那么通过x修改后,在通过y访问到的数据也是变化后的。

2.直接赋值

在如下代码中,num2 = num1不是复制。是两个变量指向同一个列表,并且修改任何一个,都会影响另外一个。

# 直接赋值:两个变量指向同一个对象,修改其中一个,就会影响另一个(互相影响)。
num1 = [10, 20, 30, 40 ,50]
num2 = num1
num2[4] = [60]
print(num1[4]) # [60]
print(num2[4]) # [60]
image-20260212154345811

3.浅拷贝

浅拷贝会创建一个新的外层容器,但内部的元素仍然引用原来的对象。

import copy
# 浅拷贝:创建一个新的外层容器,但内部元素仍然引用原来的对象
num1 = [10, 20, 30, 40]
num2 = copy.copy(num1)
num2[3] = 90
print(num2[3]) # 90
print(num1[3]) # 40
image-20260212154903196

浅拷贝存在的问题:嵌套数据仍然是共享的,修改嵌套数据会互相影响。

# 浅拷贝存在的问题:嵌套数据仍然是共享的,修改嵌套数据会互相影响
num1 = [10, 20, 30, [40, 50]]
num2 = copy.copy(num1)
num2[3][0] = 90
print(num2[3][0]) # 90
print(num1[3][0]) # 90
image-20260212155238881

4.深拷贝

创建一个新的外层容器,同时对内部所有可变对象进行递归复制(不可变对象不复制,继续引用)。

# 深拷贝:创建一个新的外层容器,并对其内部所有的【可变子对象】进行递归复制
# 备注:
#   1.深拷贝可以彻底消除数据之间的相互影响。
#   2.深拷贝遇到【不可变对象】不会复制,会直接引用。
num1 = [10, 20, 30, [40, 50]]
num2 = copy.deepcopy(num1)
num2[3][0] = 90
print(num2[3][0]) # 90
print(num1[3][0]) # 40
image-20260212155631354

特点:

  1. 深拷贝可以彻底消除数据之间的相互影响。
  2. 深拷贝遇见不可变对象不会复制,会直接引用。

注意点:

  1. 深拷贝只复制可变对象,不可变对象会直接引用。
  2. 元组中如果只包含不可变对象,则深拷贝没有效果。
# 注意点:
#   1.深拷贝只复制可变对象,不可变对象会直接引用。
a = 666
b = copy.deepcopy(a)
# 两个的内存地址是一样的
print(id(a)) # 1894113843504
print(id(b)) # 1894113843504

#   2.元组中如果只包含不可变对象,则深拷贝没有效果。
nums1 = (10, 20, 30, [40, 50])
nums2 = copy.deepcopy(nums1)

print(id(nums1)) # 1491916545120
print(id(nums2)) # 1491916544960

ps:橱窗有Python书籍,有需要的道友自行购买,让洒家赚一丢丢佣金吧。如果文章对您有帮助,我很荣信。

最新文章

随机文章