2011-09-21 173 views
0

Python腳本:Python變量範圍問題

def show(name): 
    def getName(): 
        return _name 
    def setName(value): 
     _name = value 
    _name = '' 
    print('Input parameter: ', name) 
    print('Global variable: ', say_hello) 
    print('Change private variable: ', setName(name)) 
    print('Get private variable: ', getName()) 
    print('Private variable: ', _name) 
    print('Input parameter: ', name) 
say_hello = 'hello' 
show('Jim') 

輸出:

Input parameter: Jim 
Global variable: hello Change 
private variable: None 
Get private variable: 
Private variable: 
Input parameter: Jim 

爲什麼沒有內部功能改變的_name值,但該功能show可以得到價值say_hello?我知道這是一個可變範圍問題,但我想知道一些細節。

+0

我的python版本是Python 3.2(r32:88445,Feb 21 2011,11:29:37)。 – dghost

+0

謝謝你幫我解釋我的問題!感謝大家! :^) – dghost

回答

0

_name在本例中是setName()函數的本地函數,因爲每個變量名稱都是在函數中分配的時候。

除非你有一個global聲明或3.x,一個nonlocal聲明 - 這將有助於你在這種情況下。

1

功能的賦值在函數的本地範圍內賦值。 setNamesetName的本地範圍內分配_name,外部_name不受影響。

在Python 2.X中,可以通過使用全局語句而不是外部局部作用域來分配給模塊全局作用域。

Python 3.X添加了nonlocal聲明(如果您有興趣,請參閱PEP-3104瞭解詳細信息)。在你的例子中,可以在setName中使用nonlocal來分配外部本地範圍。

This blog post討論了Python中的變量作用域以及一些很好的示例和解決方法(具體參見示例5)。

+0

謝謝!這非常有幫助。 :^) – dghost

0

爲什麼不移動show作爲say_hello方法?

class SayHello(unicode): 
    _name = u"" 
    def get_name(self): 
     return self._name 

    def set_name(self, value): 
     self._name = value 

    def show(self, name): 
     self.name = name 
     print(self, self.name) 

    name = property(get_name, set_name) 

say_hello = SayHello('hello') 
say_hello.show('Jim') 

如果不是絕對必要,應該避免使用全局變量。

+0

謝謝!這對我真的很有幫助! :^) – dghost