Functions 命名空间概念(赋值前引用)
Functions Namespace concept (referenced before assignment)
我在函数中寻找一些关于命名空间概念的解释。
这里的代码会引发 UnboundLocalError: local variable … referenced before assignment
x = 1
def foo():
print x
x = 2
我知道这应该引发异常。但我想了解 python 如何知道变量在本地命名空间中。在 print x 行,x 不在局部变量 dict 中。
x = 1
def foo():
print 'local before print x : ',locals()
print x
print 'local after print x :',locals()
x = 2
foo() # call function, print local namespace before raising exception
local before print x : {}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in foo
UnboundLocalError: local variable 'x' referenced before assignment
在打印 x 之前,local namespace dict 是空的{}(这很明显)。那么python怎么知道x是局部变量呢
这与 classes
的工作方式不同
a = [1]
class b():
c = a
a = 2
print 'c inside class ', b.c
'c inside class [1]'
d = b()
class.
中的类似情况未引发异常
如果有人能帮我解释一下概念,python如何在赋值前知道这个变量是局部变量。
我检查了很多表格和网站以寻求解释,但没有找到。
有 post 和表格解释了如何解决这个问题。例子。
UnboundLocalError: local variable … referenced before assignment。
但我正在寻找 python 在后面工作。
Python 将您的代码预编译为一些字节码。在此步骤中,它将找出每个范围(通常是函数)的标识符是引用全局变量还是局部变量。
- 如果明确声明为
global
,则它是全局的(简单情况)。
- 如果在函数中任意位置赋值而未明确声明
global
,则它是局部的。
- 如果仅在函数中读取,则假定为全局(隐式)。
这是在编译时完成的,因此不会执行任何操作来确定这一点。
现在,在运行时,如果您在赋值之前读取一个局部变量,就会出现错误。
现在,对于 classes,情况有所不同,因为那里的变量并不是真正的本地变量(即位于调用堆栈的内存中)。如果您在 b
的声明中 access a
您将访问模块全局变量,除非存在覆盖模块的 class 全局变量- 全球一个。如果您 将 赋值给 a
,您将创建(或更改)一个 class 全局变量。 a
(或分配给)的任何后续访问都将访问 class-全局(或分配给)。
我在函数中寻找一些关于命名空间概念的解释。
这里的代码会引发 UnboundLocalError: local variable … referenced before assignment
x = 1
def foo():
print x
x = 2
我知道这应该引发异常。但我想了解 python 如何知道变量在本地命名空间中。在 print x 行,x 不在局部变量 dict 中。
x = 1
def foo():
print 'local before print x : ',locals()
print x
print 'local after print x :',locals()
x = 2
foo() # call function, print local namespace before raising exception
local before print x : {}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in foo
UnboundLocalError: local variable 'x' referenced before assignment
在打印 x 之前,local namespace dict 是空的{}(这很明显)。那么python怎么知道x是局部变量呢
这与 classes
的工作方式不同a = [1]
class b():
c = a
a = 2
print 'c inside class ', b.c
'c inside class [1]'
d = b()
class.
中的类似情况未引发异常如果有人能帮我解释一下概念,python如何在赋值前知道这个变量是局部变量。
我检查了很多表格和网站以寻求解释,但没有找到。
有 post 和表格解释了如何解决这个问题。例子。 UnboundLocalError: local variable … referenced before assignment。 但我正在寻找 python 在后面工作。
Python 将您的代码预编译为一些字节码。在此步骤中,它将找出每个范围(通常是函数)的标识符是引用全局变量还是局部变量。
- 如果明确声明为
global
,则它是全局的(简单情况)。 - 如果在函数中任意位置赋值而未明确声明
global
,则它是局部的。 - 如果仅在函数中读取,则假定为全局(隐式)。
这是在编译时完成的,因此不会执行任何操作来确定这一点。
现在,在运行时,如果您在赋值之前读取一个局部变量,就会出现错误。
现在,对于 classes,情况有所不同,因为那里的变量并不是真正的本地变量(即位于调用堆栈的内存中)。如果您在 b
的声明中 access a
您将访问模块全局变量,除非存在覆盖模块的 class 全局变量- 全球一个。如果您 将 赋值给 a
,您将创建(或更改)一个 class 全局变量。 a
(或分配给)的任何后续访问都将访问 class-全局(或分配给)。