Python变量范围和.var

时间:2015-07-23 03:32:45

标签: python namespaces scope global-variables

在SaltyCraneBlog(http://www.saltycrane.com/blog/2008/01/python-variable-scope-notes/#c7900)上,我正在阅读Python中的变量作用域,一切都非常简单,直到我得到这个解决方法来设置全局变量:

def ex8():
    ex8.var = 'foo'
    def inner():
        ex8.var = 'bar'
        print 'inside inner, ex8.var is ', ex8.var
    inner()
    print 'inside outer function, ex8.var is ', ex8.var
ex8()

让我失望的是ex8.var部分。这是属性吗?如果var是ex8的属性,是否需要先定义var?可以在函数本身内调用函数的属性吗?

1 个答案:

答案 0 :(得分:1)

  

让我失望的是ex8.var部分。这是属性吗?

  

如果var是ex8的属性,是否需要首先定义var?

没有。您可以随时在对象上设置属性,而无需预先设置它们(除非对象定义了阻止您这样做的特殊行为)。

  

可以在函数本身内调用函数的属性吗?

是的,可以从函数中访问函数的属性。该函数是一个类似于另一个的对象,您可以像访问当前作用域中可访问的任何其他对象一样访问它的属性。 (该属性不是"调用"此处,因为它的值不是函数;它只是您访问的值。)

作为您提及的评论,此代码所做的事情不一定是好事。正如该博客文章中提到的,Python 3包含一个nonlocal关键字,可以消除对此类hackery的需求。即使在Python 2中,发现自己处于需要采用这种技巧的情况并不常见。