繁体   English   中英

Python变量范围问题

[英]Python variable scope issue

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

功能分配在功能本地范围内分配。 setNamesetName的本地范围内分配_name ,外部_name不受影响。

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

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

这篇博客文章讨论了Python中的变量作用域,并提供了一些不错的示例和变通方法(具体请参见示例5)。

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

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

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

如果非绝对必要,则应避免使用全局变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM