python跟java中的變量本質(zhì)是不一樣的辛藻,Python的變量實(shí)質(zhì)上是一個(gè)指針(int型或str型)陪腌,而java的變量是一個(gè)可操作的存儲(chǔ)空間幌蚊。
例1
a = 1
b = a
print(id(a), id(b)) # 2052450224 2052450224
a = 2 #不可變對象被重新賦值万栅,重新分配了一塊內(nèi)存,ID就變了
print(a, b) # 2 1
print(id(a), id(b)) # 2052450240 2052450224
例2
列表直接賦值給列表不屬于拷貝, 只是內(nèi)存地址的引用
list1 = ["a", "b", "c"]
list2 = list1
list1.append("d")
print(list1, list2) # ['a', 'b', 'c', 'd'] ['a', 'b', 'c', 'd']
print(id(list1), id(list2)) # 1947385383176 1947385383176
例3
淺拷貝
list1 = ["a", "b", "c"]
list2 = list1.copy()
list3=list(list1) #轉(zhuǎn)換也是淺copy
list1.append("d")
print(list1, list2,list3)
# ['a', 'b', 'c', 'd'] ['a', 'b', 'c'] ['a', 'b', 'c']
print(id(list1), id(list2),id(list3))
# 113196712 113196104 113196936
例4
淺拷貝, 只會(huì)拷貝第一層, 第二層的內(nèi)容不會(huì)拷貝
list1 = ["a", "b", "c", [1, 2, 3]]
list2 = list1.copy()
list1[3].append(4)
print(list1, list2)
# ['a', 'b', 'c', [1, 2, 3, 4]] ['a', 'b', 'c', [1, 2, 3, 4]]
print(id(list1), id(list2))
# 1386655149640 1386655185672
例5
深拷貝
import copy
list1 = ["a", "b", "c", [1, 2, 3]]
list2 = copy.deepcopy(list1)
list1[3].append(4)
print(list1, list2)
# ['a', 'b', 'c', [1, 2, 3, 4]] ['a', 'b', 'c', [1, 2, 3]]
print(id(list1), id(list2))
# 1452762592904 1452762606664