python中的类块和功能块之间的区别

代码1

x = 0

class Foo:
    print(x)
    x = 1
    print(x)

print(x)

结果1

0
1
0

代码2

x = 0

def foo():
    print(x)
    x = 1
    print(x)

foo()

结果2

UnboundLocalError: local variable 'x' referenced before assignment.

为什么x可以在class block引用两个名称空间中的对象?
我不明白为什么Code 1不会抛出UnboundLocalError
函数和类之间的不一致打扰了我。


更新:

几次阅读Python文档后,我仍然无法理解范围规则。

以下是块:模块,函数体和类定义。 ...[跳跃]...

如果名称被绑定在一个块中,那么它是该块的局部变量,除非声明为非局部变量。 如果名称在模块级绑定,它是一个全局变量。 (模块代码块的变量是局部变量和全局变量。)如果在代码块中使用了一个变量,但在那里未定义,则它是一个自由变量。

如果名称绑定操作发生在代码块中的任何位置,则该块内名称的所有用法将被视为对当前块的引用。 当一个块在绑定之前在一个块内使用时,这可能会导致错误。 这条规则很微妙。 Python缺少声明,并允许在代码块中的任何位置进行名称绑定操作。 代码块的局部变量可以通过扫描块的整个文本进行名称绑定操作来确定。


x = 0

class Foo:
    print(x)   # Foo.x isn't defined yet, so this is the global x
    x = 1      # This is referring to Foo.x
    print(x)   # So is this

print(x)

x = 0

def foo():
    print(x)   # Even though x is not defined yet, it's known to be local
               # because of the assignment
    x = 1      # This assignment means x is local for the whole function
    print(x)

foo()

为了让这些例子具有可比性,请不要忘记使用global声明:

def foo():
    global x
    print(x)
    x = 1
    print(x)

这样你就不会得到UnboundLocalError


类块不知道“本地”变量,只是类变量。 它们与局部变量的不同之处在于它们在执行该块之后不会被遗忘; 他们将在课堂上保持领域。 局部变量和类变量的处理方式不仅仅是这方面的内容,所以没有出现未绑定错误也不足为奇。 毕竟你没有一个未定义的局部变量来映射全局变量。 因此,在定义类变量之前访问全局变量是没有问题的。

也许编译器应该以某种方式警告这一点,但目前情况并非如此。

链接地址: http://www.djcxy.com/p/96679.html

上一篇: Differences between class block and function block in python

下一篇: Upgrade SQL Server 2012 LocalDB to SQL Server 2014 LocalDB