2012-07-09 102 views
3
>>> def nil(): 
...  ss='nil' 
...  print ss 
... 
>>> nil() 
nil 
>>> nil.ss='kk' 
>>> nil() 
nil 
>>> print nil.ss 
kk 

我知道一切都是python中的對象,所以函數也是一個對象,現在我想改變存儲在函數中的'ss'變量的值,現在我試圖通過使用nil來改變它的值。但它並沒有改變......兩個'ss'之間的差異是什麼?如何訪問函數的內部變量,並在python中更改其值?

回答

4

第一個ss是函數的內部變量;第二個是函數的一個屬性。他們不參考同一個對象。

這裏有一個辦法做到這一點,雖然:

>>> def apple(): 
    if not hasattr(apple, 'ss'): # This way it'll only be set inside the function once 
     apple.ss = 'nil' 
    return apple.ss 

>>> apple() 
'nil' 
>>> apple.ss 
'nil' 
>>> apple.ss = 'kk' 
>>> apple.ss 
'kk' 
>>> apple() 
'kk' 
3

功能是一個對象,但ss是不是在這個意義上它是一個類的成員變量。它是在函數體中定義的局部變量,不能在外部訪問。改變它的唯一理想的方法是改變函數的實現。

1
def nil(): 
ss='nil' 

這是因爲nil.ss沒有指向在nil函數定義的varible ss

nil.ss表示ss現在是nil對象的屬性。

nil.ssss裏面的nil()是完全不同的。

>>> def nil(): 
    ss='foo' 
    return ss 

>>> nil.ss='bar' 
>>> foo=nil() 
>>> bar=nil() 
>>> nil.ss 
'bar' 
>>> foo 
'foo' 
>>> bar 
'foo' 
0

要回答你的問題的另一部分:你不能在本地變量ss從函數外部改變。除非函數正在執行,否則它不存在。

1

你在函數體內創建的ss只是一個臨時變量;直到該行代碼被執行,它才存在,並且一旦到達塊的末尾,它就不再存在。您在該函數上創建的ss是該函數的一個屬性。現在你有兩個不同的變量,名字叫ss,但他們完全沒有關係。

0

您可以使用編譯器模塊修改代碼。它將允許你以文本形式加載任意的python代碼,將其解析爲抽象語法樹,對其進行修改,然後重新編譯它。之後,您可以使用其他更改運行代碼。

http://docs.python.org/library/compiler.html

雖然它在Python 3.0棄用我不會建議使用它。在3.0中可能有其他方式來做到這一點,因爲否則它們不會棄用模塊。我們真的不得不問,奇怪的是,你試圖用你想寫的這個方法來解決這個問題嗎?無論你需要做什麼,你都可以用更簡單的方式來做到這一點。可以通過函數的參數或者您設計的適合您需要的類結構。

+0

這只是一個概念清除...與任何東西無關.. – 2012-07-09 19:50:06

相關問題