2011-09-21 178 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