1. 程式人生 > 程式設計 >Python動態型別實現原理及過程解析

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,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]]

淺拷貝中可變物件中巢狀的可變物件的引用還是原來的引用。

深拷貝可以拷貝巢狀的物件結構。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。