1. 程式人生 > >python 變量引用

python 變量引用

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 變量引用