賦值與共享資源
在Python中,直接賦值操作(如 list2 = list1
)會導致兩個變量共享同一個內存地址。這意味著對 list1
的修改會直接影響到 list2
,因為它們指向同一個對象。
- 注意: 賦值等于完全共享資源
- ?如果我們不希望這樣完全共享,可以使用淺拷貝和深拷貝
- 導入copy模塊
list1 = [1,2,3,4,5]
print(list1)
list2 = list1
print(list2)
list1.append(6)
print(list1)
print(list2)
淺拷貝
淺拷貝通過 copy.copy()
實現,它創建一個新的對象,但只拷貝第一層的數據。嵌套層的數據仍然指向原來的內存地址。
- 優點:拷貝速度快,占用空間少,拷貝效率高
import copy
list3 = [1,2,3,4,5,[6,7,8]]
list4 = copy.copy(list3)
print("list3內存地址:%s"%(id(list3)))
print("list4內存地址:%s"%(id(list4)))
print("list3內存嵌套地址:%s"%(id(list3[5])))
print("list4內存嵌套地址:%s"%(id(list4[5])))
list3.append(8)
list3[5].append(100)
print(list3)
print(list4)
深拷貝
深拷貝通過 copy.deepcopy()
實現,它完全拷貝所有層的數據,新對象與原對象完全不共享內存地址。
list5 = [1,2,3,4,5,[6,7,8]]
list6 = copy.deepcopy(list5)
print("list5內存地址:%s"%(id(list5)))
print("list6內存地址:%s"%(id(list6)))
print("list5內存嵌套地址:%s"%(id(list5[5])))
print("list6內存嵌套地址:%s"%(id(list6[5])))
list5.append(100)
list5[5].append(1000)
print(list5)
print(list6)
可變對象與不可變對象
可變對象(如列表、字典、集合)在修改時內存地址不變,
而不可變對象(如數值類型、字符串、元組)在修改時會生成新的對象,分配新的內存空間。
list7 = [1,2,3,4,5]
print("list7的原內存地址%s"%(id(list7)))
list7.append(5)
print("list7增加數據后的內存地址%s"%(id(list7)))int1 = 10
print("int1的原內存地址%s"%(id(int1)))
int1 = 100
print("int1的原內存地址%s"%(id(int1)))str1 = "hello"
print("str1的內存地址%s"%(id(str1)))
str1 = "nihao"
print("str1的內存地址%s"%(id(str1)))tuple1 = (1,2,3,4,5)
print("tuple1的內存地址%s"%(id(tuple1)))
tuple1 = (2,3,4,5,6)
print("tuple1的內存地址%s"%(id(tuple1)))