python 變量引用


最近在看<<流暢的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類的實例

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM