以下工作正常,即它不会出现任何错误:
def foo(arg):
class Nested(object):
x = arg
foo('hello')
但以下引发了一个例外:
def foo(arg):
class Nested(object):
arg = arg # note that names are the same
foo('hello')
回溯:
Traceback (most recent call last):
File "test.py", line 6, in <module>
foo('hello')
File "test.py", line 3, in foo
class Nested(object):
File "test.py", line 4, in Nested
arg = arg
NameError: name 'arg' is not defined
我无法理解这种行为的原因。有人可以解释一下吗?
答案 0 :(得分:5)
arg
属性隐藏arg
函数参数(内部范围)
def foo(arg):
class Nested(object):
arg = arg # you try to read the `arg` property which isn't initialized
如果在解释器窗口中键入i = i
而未初始化i
变量,则会出现相同的错误。
答案 1 :(得分:3)
如果尝试分配给函数中的变量,Python假定变量是该函数的本地变量。因此,通过尝试将arg分配给自身的值,您隐式将其声明为局部变量。
答案 2 :(得分:3)
这是由于Python的范围规则:
def foo(arg): # (1)
class Nested(object):
arg = arg # (2)
(2)在类'命名空间中定义一个新的'arg'名称,它在外部命名空间(1)中显示另一个'arg'的值。
但是,(2)是不必要的,以下内容完全有效:
def foo(arg):
class Nested(object):
def message(self):
print arg
return Nested()
nested = foo('hello')
nested.message()
(打印hello
)