gpt4 book ai didi

python - 函数命名空间概念(赋值前引用)

转载 作者:太空宇宙 更新时间:2023-11-03 14:40:32 24 4
gpt4 key购买 nike

我在函数中寻找一些有关命名空间概念的解释。

这里的代码会引发UnboundLocalError:局部变量...在赋值之前引用

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

在 print x 之前,本地命名空间 dict 是空的 {}(这是非常明显的)。那么python怎么知道x是局部变量呢。

这与类的工作方式不同

a = [1]
class b():
c = a
a = 2

print 'c inside class ', b.c
'c inside class [1]'

d = b()

类里面类似情况没有引发异常。

如果有人可以帮我解释一下概念,Python如何在赋值之前知道这个变量是局部变量。

我检查了许多表格和网站以寻求解释,但没有找到任何解释。

有一些帖子和表格解释了如何解决此案例。例子。 UnboundLocalError: local variable … referenced before assignment 。但我正在寻找在后面工作的 python。

最佳答案

Python 将您的代码预编译为一些字节码。在此步骤中,它将找出每个作用域(通常是函数)的标识符是否引用全局变量或局部变量。

  • 如果显式声明为global,则它是全局的(简单情况)。
  • 如果在函数中的任何地方为其分配了一个值,而没有显式声明全局,则该值是本地的。
  • 如果仅在函数中读取,则假定它是全局的(隐式)。

这是在编译时完成的,因此不会执行任何操作来确定这一点。

现在,在运行时,如果您在分配局部变量之前读取它,则会收到错误。

现在,对于类,情况会有所不同,因为那里的变量并不是真正的本地变量(即位于调用堆栈的内存中)。如果您在 b 声明中访问 a,您将访问模块全局变量,除非存在覆盖模块的类全局变量全局一。如果您分配a,您将创建(或更改)一个类全局变量。对 a 的任何后续访问(或赋值给)都将访问类全局变量(或赋值给)。

关于python - 函数命名空间概念(赋值前引用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46580976/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com