gpt4 book ai didi

python noobie范围问题

转载 作者:太空狗 更新时间:2023-10-29 20:37:32 25 4
gpt4 key购买 nike

我写了这段代码:

x = 0
def counter():
x = 1
def temp(self):
print x
x += 1
return temp

尝试测试 python 是词法作用域还是动态作用域。我的想法是

y = counter()
y()

应该打印 0 或 1,这会告诉我 python 的范围。但是,调用 y 会抛出一个异常,提示 x 未定义。我对 Python 工作原理的理解似乎存在根本性的缺陷。

谁能解释一下这是如何工作的?是的,我知道这可以使用对象轻松完成。我正在尝试探索在不使用对象的情况下赋予函数状态的想法。我这样写代码是因为上面的代码翻译成像 Scheme 这样的词法范围的语言肯定会起作用。

最佳答案

来自 the docs :

A special quirk of Python is that – if no global statement is in effect – assignments to names always go into the innermost scope. Assignments do not copy data — they just bind names to objects.

所以,当 Python 解析时

 def temp(self):
print x
x += 1

它看到赋值 x += 1 并因此决定 x 必须在最内层的范围内。稍后您通过 y() 调用 temp(...) 时——(顺便说一句,self 应该省略来自 temp 的定义或者 y() 应该提供一个参数)——Python 遇到 print x 语句并发现 x 尚未在本地(最内层)范围内定义。因此错误,

UnboundLocalError: local variable 'x' referenced before assignment

如果你声明

 def temp(self):
global x

然后 Python 将在全局范围内查找 x(其中 x=0)。在 Python2 中,无法告诉 Python 在扩展范围(其中 x=1)中查找 x。但是在 Python3 中可以通过声明来实现

 def temp(self):
nonlocal x

关于python noobie范围问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6171033/

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