標籤:形參 答案 col rem 問題 產生 python remove 建立
最近在看<<流暢的python>>關於變數引用部分時,有一些自己的看法,就再次記錄一下.
問題:
# From flunet python example 8-8class Bus: def __init__(self, passengers=[]): self.passengers = passengers def pick(self, name): self.passengers,append(name) def remove(self, name): self.passengers.remove(name)>> bus1 = Bus() # 執行個體化>> bus2 = Bus() # 執行個體化>> bus1.append(‘Bob‘)>>bus2.passengers # bus2的passengers也有值 [‘Bob‘]
為什麼bus1中passengers發生改變會導致bus2中passengers發生改變?
這說明兩個Bus的執行個體共用了一個self.passengers,明明是兩個執行個體?
在往上看,self.passengers引用的是passengers的值,也就是__init__中的形參(變數).這個參數在兩個執行個體中是共用的,執行個體化的過程中,都會用到passengers這個list.
再仔細想一想,每一次執行個體化過程不都會建立一個passengers嗎?這就是問題的所在.答案是passengers這個形參並不是在執行個體化過程中建立的,而是在方法定義的時就產生了.也就是因為在這個過程早於執行個體化過程,不同的執行個體才能共用passengers變數.
再定義一個函數:
def foo(x=[]): print id(x)>> f1 = foo()139916453629536>> f2 = foo()139916453629536
兩次id是一樣的,也說明參數x的記憶體空間是在函數定義時建立的
看看foo函數的預設參數變數以及id
>> foo.func_defaults([],)>> id(foo.func_defaults[0])139916453629536
可以看到id的結果都是一樣的,同樣也驗證了參數變數的記憶體空間是在調用之前(定義時)建立的.
回頭看看,除了參數變數的引用之外,還有幾點看法:
(1)方法和函數的參數引用方式是一致的,都是在定義時建立記憶體空間
(2)函數也是function類的執行個體
python 變數引用