Python 引用/浅拷贝/深拷贝

1.前置知识,可变类型和不可变类型

不可变类型:
  不可变类型对象一旦创建,其值不可修改.任何修改操作实际会创建新的对象,原对象会保持不变.
  整数/浮点数/复数/字符串/元组/布尔值,元组本身是不可变的,但是如果包含可变元组(如列表),其内容可被间接修改.
可变类型:
  可变类型对象可以直接修改,内存地址不变.
  列表/字典/集合/字节数组

2.引用

a = [1,2,[3,4]]
b = a

# a,b变量指向同一个对象,没有创建新的对象.

3.浅拷贝

import copy

a = [1,2,[3,4]]
b = copy.copy(a)

# 浅拷贝只拷贝父对象,不拷贝对象的子对象.
# 拷贝a对象时,会创建一个新的对象(有自己的内存地址),将a对象拷贝过去,对于a对象的子对象,不会进行拷贝.
# 即, b与a不指向同一个对象,但是a内部的引用,b直接复用.

4.深拷贝

import copy

a = [1,2,[3,4]]
b = copy.deepcopy(a)

# 深拷贝会递归拷贝原对象.

# 对于不可变类型,拷贝不会创建新的对象,而是直接返回引用,这是由于不可变类型的特性,直接返回引用也是安全的,且能减少内存占用,这也是python的特性.
# 对于可变类型,拷贝会创建新的对象,然后引用这个新的对象.
# 遵循上面的规则,深拷贝会递归地拷贝对象中的所有层级的子对象.

5.特殊情况

元组是不可变类型,
浅拷贝时,会直接返回引用,不管里面是不是有可变类型的对象.
深拷贝时,如果内部都是不可变类型的对象,那么也是直接返回引用;如果内部有可变类型的对象,那么会创建新的对象.

 

posted @ 2025-07-18 12:29  CJTARRR  阅读(11)  评论(0)    收藏  举报