python 變量引用
阿新 • • 發佈:2018-08-05
spa 結果 str 發生 ger 而是 也說 自己 默認參數
最近在看<<流暢的python>>關於變量引用部分時,有一些自己的看法,就再次記錄一下.
問題:
# From flunet python example 8-8 class 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 變量引用