【问题标题】:Python variable scope issuePython变量范围问题
【发布时间】:2011-11-21 16:39:34
【问题描述】:

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

【问题讨论】:

  • 我的 python 版本是 Python 3.2 (r32:88445, Feb 21 2011, 11:29:37)。
  • 感谢您帮助我解释我的问题!谢谢大家! :^)

标签: python variables scope


【解决方案1】:

在这种情况下,_namesetName() 函数的局部变量,因为在函数中分配了每个变量名。

除非您有 global 语句,或者在 3.x 中,有一个 nonlocal 语句 - 在这种情况下会为您提供帮助。

【讨论】:

    【解决方案2】:

    函数中的赋值是在函数局部范围内赋值的。 setNamesetName 的局部范围内分配_name,外部_name 不受影响。

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

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

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

    【讨论】:

    • 谢谢!这很有帮助。 :^)
    【解决方案3】:

    为什么不将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')
    

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

    【讨论】:

    • 谢谢!对我真的很有帮助! :^)
    猜你喜欢
    • 2018-12-06
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 2011-04-13
    • 2011-10-20
    • 2016-06-21
    • 2011-04-10
    相关资源
    最近更新 更多