python 變數引用

來源:互聯網
上載者:User

標籤:形參   答案   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 變數引用

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.