首页
学习
活动
专区
圈层
工具
发布
30 篇文章

Python基础语法-基本数据类型-深浅拷贝(一)

在Python中,数据类型有可变和不可变之分,这也决定了Python中的拷贝操作有深拷贝和浅拷贝之分。本文将详细介绍Python中的深拷贝和浅拷贝的概念、区别以及使用方法。

一、浅拷贝

浅拷贝是指创建一个新的对象,但是这个新的对象只是原对象的一个副本,它们共享同一块内存地址。当原对象中的数据发生改变时,浅拷贝对象的数据也会发生相应的变化。

在Python中,可以使用切片(slice)操作、工厂函数或者copy()方法实现浅拷贝。

切片操作

切片操作是Python中非常常用的一种浅拷贝方法,可以用来复制列表、元组、字符串等序列类型对象。

代码语言:javascript
复制
list1 = [1, 2, [3, 4]]
list2 = list1[:]
list3 = list(list1)
list4 = list1.copy()

print(id(list1))  # 140061693619008
print(id(list2))  # 140061693485504
print(id(list3))  # 140061693460736
print(id(list4))  # 140061693673408

list1[0] = "hello"
list1[2][0] = "world"

print(list1)  # ["hello", 2, ["world", 4]]
print(list2)  # [1, 2, ["world", 4]]
print(list3)  # [1, 2, ["world", 4]]
print(list4)  # [1, 2, ["world", 4]]

从上述代码可以看出,使用切片操作、list()工厂函数或者copy()方法可以创建浅拷贝对象。在对原列表进行修改时,由于浅拷贝对象和原列表共享同一块内存地址,所以浅拷贝对象的数据也会发生相应的变化。

工厂函数

Python中内置了一些工厂函数可以用来创建新的序列对象,例如list()、tuple()、set()等函数。

代码语言:javascript
复制
list1 = [1, 2, [3, 4]]
list2 = list(list1)
tuple1 = tuple(list1)
set1 = set(list1)

print(id(list1))  # 140563157875008
print(id(list2))  # 140563157299840
print(id(tuple1))  # 140563157467360
print(id(set1))  # 140563157876384

list1[0] = "hello"
list1[2][0] = "world"

print(list1)  # ["hello", 2, ["world", 4]]
print(list2)  # [1, 2, ["world", 4]]
print(tuple1)  # (1, 2, ["world", 4])
print(set1)  # {1, 2, ["world", 4]}

从上述代码可以看出,使用list()函数、tuple()函数或者set()函数可以创建浅拷贝对象。在对原列表进行修改时,由于浅拷贝对象和原列表共享同一块内存地址,所以浅拷贝对象的数据也会发生相应的变化。

copy()方法

Python中的可变数据类型都有一个copy()方法,可以用来创建新的对象。

代码语言:javascript
复制
list1 = [1, 2, [3, 4]]
list2 = list1.copy()

print(id(list1))  # 140563157876800
print(id(list2))  # 140563157877120

list1[0] = "hello"
list1[2][0] = "world"

print(list1)  # ["hello", 2, ["world", 4]]
print(list2)  # [1, 2, ["world", 4]]

从上述代码可以看出,使用copy()方法可以创建浅拷贝对象。在对原列表进行修改时,由于浅拷贝对象和原列表共享同一块内存地址,所以浅拷贝对象的数据也会发生相应的变化。

举报
领券