gpt4 book ai didi

python - 类中生成器中的变量作用域

转载 作者:太空狗 更新时间:2023-10-29 18:03:36 26 4
gpt4 key购买 nike

我认为我很了解变量和生成器在 Python 中的工作方式。
但是,下面的代码让我感到困惑。

from __future__ import print_function

class A(object):
x = 4
gen = (x for _ in range(3))

a = A()
print(list(a.gen))

当运行代码(Python 2)时,它说:

Traceback (most recent call last):
File "Untitled 8.py", line 10, in <module>
print(list(a.gen))
File "Untitled 8.py", line 6, in <genexpr>
gen = (x for _ in range(3))
NameError: global name 'x' is not defined

在 Python 3 中,它说 NameError: name 'x' is not defined
但是,当我运行时:

from __future__ import print_function

class A(object):
x = 4
lst = [x for _ in range(3)]

a = A()
print(a.lst)

该代码在 Python 3 中不起作用,但在 Python 2 中或在这样的函数中有效

from __future__ import print_function

def func():
x = 4
gen = (x for _ in range(3))
return gen

print(list(func()))

此代码在 Python 2 和 Python 3 或模块级别上运行良好

from __future__ import print_function

x = 4
gen = (x for _ in range(3))

print(list(gen))

该代码在 Python 2 和 Python 3 中也能正常运行。

为什么在class中出错了?

最佳答案

如其他答案所述,它发生是 True 因为它是静态变量。但限制您的代码工作的不仅仅是那个属性。实际原因是变量的范围和它执行的范围。例如,创建一个类:

class A(object):
x = 999999
y = x +1

如果您访问它的类属性 A.xA.y,它将起作用。因为,在初始化y时,x被替换为表达式x+1中的值。由于 x 的范围在类内。

然而,这不会发生在生成器的情况下。即在你的例子中:

class A(object):
x = 4
gen = (x for _ in range(3))

当您执行 list(a.gen) 时,它会在类外执行(因为生成器是在运行时评估的)并检查 x 的引用在当前范围内。由于 x 未在该范围内初始化,因此会抛出错误。

当您显式初始化 x=4 时,它会起作用,因为现在生成器表达式具有可以使用的 x 值。

为了使您的生成器表达式工作,正如其他人所说,您必须像这样定义它:

class A(object):
x = 4
gen = (A.x for _ in range(3))
# ^ mentioning `A.x` is the value to access

关于python - 类中生成器中的变量作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40848736/

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