2010-06-01 94 views
1

我知道LEGB规则。但是,一个函数是否具有对封闭函数中定义的变量的读取访问权限的简单测试看起来并不实际。即:为什么我的函数不能在封闭函数中访问变量?

#!/usr/bin/env python2.4 
'''Simple test of Python scoping rules''' 

def myfunction(): 
    print 'Hope this works: '+myvariable 

def enclosing(): 
    myvariable = 'ooh this worked' 
    myfunction() 

if __name__ == '__main__': 
    enclosing() 

返回:

NameError: global name 'myvariable' is not defined 

难道我做错了什么?除了LEGB决议命令还有更多吗?

+3

只是命名函数“enclosing”不会使它如此:) – 2010-06-01 09:27:10

+0

是的。我错误地认为'包含'包含的调用函数,但它实际上是指嵌套函数的父项。 – mikemaccana 2010-06-01 09:44:45

+0

没有必要恢复有效的标签。这不是关于你,而是关于这个问题。 – SilentGhost 2010-06-01 09:46:00

回答

2

你可以...

,如果你这样做是这样的:

#!/usr/bin/env python2.4 
'''Simple test of Python scoping rules''' 

def enclosing(): 
    myvariable = 'ooh this worked' 

    def myfunction(): 
     print 'Hope this works: ' + myvariable 

    myfunction() 

if __name__ == '__main__': 
    enclosing() 

...否则你的函数不知道去哪里找(也确实如此,但它看起来在全局变量,这就是为什么你会收到错误的原因)(如果你不能将函数定义为嵌套函数,则将其作为参数传递)

+0

(如果你想*分享*一个变量,你可以添加“全球”关键字到这两个函数,使他们共享一个全局变量,但我会强烈**建议不要做这样的事情,除非绝对必要) – 2010-06-01 09:29:09

+0

(即“全球myvariable”到两个函数的开头) – 2010-06-01 09:29:53

+0

谢谢特伦斯。似乎我错误地认为调用函数被认为是“封闭的”,但该术语专指嵌套函数的父代。 – mikemaccana 2010-06-01 09:34:01

相关问题