Python变量范围问题

时间:2011-09-21 07:13:46

标签: python variables scope

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的值?我知道这是一个可变范围问题,但我想知道一些细节。

3 个答案:

答案 0 :(得分:1)

函数中的赋值在函数局部范围中指定。 setName_name的本地范围内指定setName,外部_name不受影响。

在Python 2.X中,可以使用全局语句分配给模块全局范围,但不能分配给外部本地范围。

Python 3.X添加了nonlocal语句(如果您有兴趣,请参阅PEP-3104了解详细信息)。在您的示例中,可以在setName中使用nonlocal来分配外部本地范围。

This blog post讨论了Python中的变量作用域,并提供了一些很好的示例和解决方法(具体见示例5)。

答案 1 :(得分:0)

在这种情况下,

_namesetName()函数的本地函数,因为每个变量名都是在函数中赋值的。

除非您有global语句或3.x,nonlocal语句,否则在这种情况下会对您有帮助。

答案 2 :(得分: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')

如果不是绝对必要,你应该避免使用全局变量。

相关问题