Python動態型別實現原理及過程解析
在python中,我們使用變數時,並沒有宣告變數的存在和型別。型別是在執行過程中自動決定的。
a = 3
python將會執行三步去完成上面這個請求。
1.建立一個物件代表3
2.建立一個變數a,如果a未建立。
3.將變數a與物件3相連線。
可以將變數a看作物件3的一個引用。
a = 3
b = a
多個變數可以指向同一個物件,在Python中叫共享引用。
Python在每個物件中保持了一個計數器,用於記錄當前指向該物件的引用的數目,一旦計數器被設定為0,該物件的記憶體空間就會自動回收。
原處修改物件
由於共享引用的存在,有一些物件和操作會在原處修改物件。
Python中物件可分為可變型別物件和不可變型別物件。
可變物件:列表,字典
不可變物件:數字,字串,元組
如果變數是不可變物件的引用,對變數名的修改不會影響其他變數,而是直接連線到修改的物件。
a = 3
b = a
print(a)# 3
print(b)# 3a = 4
print(a)# 4
print(b)# 3
如果變數是可變物件的引用,對變數名的修改會影響其他變數。
a = [1,2,3]
b = a
print(a)# [1,3]
print(b)# [1,3]a[0] = 4
print(a)# [4,3]
print(b)# [4,3]
拷貝
所以當你需要建立一個與原列表一樣同時又獨立於原列表的列表時,可以使用拷貝。
下面介紹最常用的兩種。
a = [1,3]
b = a[:]
print(a)# [1,3]
此時b引用的是a所引用的物件的拷貝。a,b指向不同的記憶體區域。
在字典和集合中,無法使用這種方法。
可以使用標準庫中的copy模組
import copy
a = [1,[3]]
b = copy.copy(a)# 淺拷貝
c = copy.deepcopy(a)# 深拷貝a[0] = 0
a[-1].append(4)print(a)# [0,[3,4]]
print(b)# [1,4]]
print(c)# [1,[3]]
淺拷貝中可變物件中巢狀的可變物件的引用還是原來的引用。
深拷貝可以拷貝巢狀的物件結構。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。