Python動態類型

  • 2020 年 8 月 18 日
  • 筆記

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)# 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
a[-1].append(4)

print(a)# [0, 2, [3, 4]]
print(b)# [1, 2, [3, 4]]
print(c)# [1, 2, [3]]

淺拷貝中可變對象中嵌套的可變對象的引用還是原來的引用。

深拷貝可以拷貝嵌套的對象結構。