python中深浅拷贝以及可变对象和不可变对象

目录

一、深浅拷贝

[浅拷贝(Shallow Copy)](#浅拷贝(Shallow Copy))

[深拷贝(Deep Copy)](#深拷贝(Deep Copy))

总结

[二、 可变对象](#二、 可变对象)

三、不可变对象


一、深浅拷贝

在 Python 中,深拷贝(deep copy)和浅拷贝(shallow copy)是用来复制对象的两种不同方式。深拷贝会复制对象及其所有嵌套对象的所有内容,而浅拷贝只复制对象本身及其直接引用的对象。

浅拷贝(Shallow Copy)

浅拷贝会创建一个新的对象,但是新对象中的元素是原始对象中元素的引用。如果原始对象中存在可变对象(例如列表或字典),则新对象中的引用会指向相同的可变对象。外层的内存地址不同,内层的内存地址相同。

你可以使用 copy 模块中的 copy() 方法来创建一个浅拷贝。例如:

python 复制代码
import copy

list1 = [1, 2, [3, 4]]
list2 = copy.copy(list1)

在这个例子中,list2 是 list1 的浅拷贝。修改 list2 中的嵌套列表的值会同时影响到 list1 中的列表,因为它们引用的是同一个列表对象。

深拷贝(Deep Copy)

深拷贝会创建一个新的对象,新对象中的元素是原始对象元素的完全副本,包括所有嵌套对象。这意味着无论对新对象还是原始对象进行任何修改,都不会影响对方。

你可以使用 copy 模块中的 deepcopy() 方法来创建一个深拷贝。例如:

python 复制代码
import copy

list1 = [1, 2, [3, 4]]
list2 = copy.deepcopy(list1)

在这个例子中,list2 是 list1 的深拷贝。修改 list2 中的嵌套列表的值不会影响到 list1 中的列表,因为它们引用的是不同的列表对象的副本。

总结

  • 浅拷贝会复制对象本身及其直接引用的对象,但不会递归复制所有嵌套对象。
  • 深拷贝会递归复制对象及其所有嵌套对象,保证原始对象和拷贝对象的完全独立性。

二、 可变对象

在Python中,可变对象是指其内容可以被修改的对象,例如列表(list)、字典(dictionary)、集合(set)等。当对可变对象进行修改时,其内存地址不会发生改变,因为Python会在原地修改对象的内容,而不会创建新的对象。

下面是一个示例来说明可变对象的内存地址在修改后并未改变的情况:

python 复制代码
my_list = [1, 2, 3]
print(id(my_list))  # 打印列表对象的内存地址

# 修改列表内容
my_list.append(4)
print(id(my_list))  # 再次打印列表对象的内存地址,与之前相同

# 修改列表内容
my_list[0] = 10
print(id(my_list))  # 再次打印列表对象的内存地址,仍然与之前相同

在上面的示例中,虽然我们对列表对象my_list进行了多次修改,但它的内存地址始终保持不变。这意味着Python在对可变对象进行修改时,会在原有的内存地址上直接修改对象的内容,而不会创建新的对象。

三、不可变对象

在Python中,不可变对象是指其内容不能被修改的对象,例如整数(int)、浮点数(float)、字符串(str)、元组(tuple)等。与可变对象不同的是,对不可变对象进行修改会创建一个新的对象,而原对象的内存地址不会改变。

下面是一个示例来说明不可变对象在修改时会创建新对象的情况:

python 复制代码
my_int = 42
print(id(my_int))  # 打印整数对象的内存地址

# 修改整数值
my_int = 10
print(id(my_int))  # 再次打印整数对象的内存地址,发现已经变化

my_str = "hello"
print(id(my_str))  # 打印字符串对象的内存地址

# 修改字符串内容
my_str += " world"
print(id(my_str))  # 再次打印字符串对象的内存地址,发现已经变化

在上面的示例中,我们对整数和字符串对象进行了修改,每次修改后都打印了对象的内存地址。可以看到,每次修改不可变对象时,Python都会创建一个新的对象来存储修改后的内容,而原对象的内存地址会保持不变。

相关推荐
dialect_5 小时前
KMP算法
开发语言·c++·算法
总要学点什么6 小时前
第89篇:三维特效-螺旋圆效果——让螺旋臂卷起一圈圈外扩的涟漪
开发语言·javascript·ecmascript·webgl·cesium·空间分析·1024程序员节
前端精髓6 小时前
结构化输出with_structured_output(抽卡)
python·langchain
尹人入圣7 小时前
目前热门的IP驱动产业新场景新工具
网络·python·网络协议·tcp/ip
开开心心_Every7 小时前
快速隐藏程序工具自定义快捷键一键切换
java·开发语言·前端·spring·智能手机·word·intellij-idea
chenbingjie_c8 小时前
C++ 多态完全指南:从虚函数重写到虚函数表原理
开发语言·c++
Nuanyt8 小时前
Agent 学习笔记(下篇三):上线工程、进阶选择与操作界面(Stage 7 / 7.5 / 8 + 延伸路线)
笔记·python·学习·memory·aiagent·harness
吴卫斌8 小时前
定投ETF实战指南(四):行业/主题ETF——定投的“进攻端“
开发语言·python·股票·量化
2601_967987378 小时前
Python——入门级(定义功能def函数)
python·函数·可变参数·默认参数·关键字参数
超级架构师9 小时前
PRAXO-CORE 2.5.0:用 conformance 和显式边界构建 Go Agent 框架
开发语言·人工智能·后端·golang·ai编程·智能体框架·praxo-core