在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)# 3
a = 4
print(a)# 4
print(b)# 3
如果變數是可變物件的引用,對變數名的修改會影響其他變數。
a = [1,2,3]
b = a
print(a)# [1, 2, 3]
print(b)# [1, 2, 3]
a[0] = 4
print(a)# [4, 2, 3]
print(b)# [4, 2, 3]
所以當你需要建立乙個與原列表一樣同時又獨立於原列表的列表時,可以使用拷貝。
下面介紹最常用的兩種。
a = [1,2,3]
b = a[:]
print(a)# [1, 2, 3]
print(b)# [1, 2, 3]
a[0] = 4
print(a)# [4, 2, 3]
print(b)# [1, 2, 3]
此時b引用的是a所引用的物件的拷貝。a,b指向不同的記憶體區域。
在字典和集合中,無法使用這種方法。
可以使用標準庫中的copy模組
import copy
a = [1,2,[3]]
b = copy.copy(a)# 淺拷貝
c = copy.deepcopy(a)# 深拷貝
a[0] = 0
print(a)# [0, 2, [3, 4]]
print(b)# [1, 2, [3, 4]]
print(c)# [1, 2, [3]]
淺拷貝中可變物件中巢狀的可變物件的引用還是原來的引用。
深拷貝可以拷貝巢狀的物件結構。
Python 動態型別
動態型別 dynamic typing 是python另乙個重要的核心概念。我們之前說過,python的變數 variable 不需要宣告,而在賦值時,變數可以重新賦值為任意值。這些都與動態型別的概念相關。1.動態型別 在我們接觸的物件中,有一類特殊的物件,是用於儲存資料的。常見的該類物件包括各種數...
python動態型別
python是動態語言。不需要事先宣告變數型別,同一變數可以被賦值為不同的物件型別。不可變型別 不可變型別,物件一旦建立不可修改。整數型別 int 浮點數型別 float 複數型別 complex 字串型別 str 元祖型別 tuple 集合型別 set,都屬於不可變型別。下面通過變數賦值的過程理解...
Python 動態型別定義
動態型別以及由它提供的多型性,這個概念無疑是python語言的簡潔性和靈活性的基礎。在python中,並不會宣告指令碼中使用的物件的確切的型別。事實上,程式甚至可以不在意特定的型別 相反地,它們能夠自然地適用於更廣泛的場景下,因為動態型別是python語言靈活性的根源。變數建立 乙個變數,例如a,當...