在Python中,数据类型有可变和不可变之分,这也决定了Python中的拷贝操作有深拷贝和浅拷贝之分。本文将详细介绍Python中的深拷贝和浅拷贝的概念、区别以及使用方法。
浅拷贝是指创建一个新的对象,但是这个新的对象只是原对象的一个副本,它们共享同一块内存地址。当原对象中的数据发生改变时,浅拷贝对象的数据也会发生相应的变化。
在Python中,可以使用切片(slice)操作、工厂函数或者copy()方法实现浅拷贝。
切片操作是Python中非常常用的一种浅拷贝方法,可以用来复制列表、元组、字符串等序列类型对象。
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()等函数。
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()函数可以创建浅拷贝对象。在对原列表进行修改时,由于浅拷贝对象和原列表共享同一块内存地址,所以浅拷贝对象的数据也会发生相应的变化。
Python中的可变数据类型都有一个copy()方法,可以用来创建新的对象。
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()方法可以创建浅拷贝对象。在对原列表进行修改时,由于浅拷贝对象和原列表共享同一块内存地址,所以浅拷贝对象的数据也会发生相应的变化。