关于生成器在类中作用域混乱的问题

第一种方式:

python 2:

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

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

result:

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

python3 result: NameError: name 'x' is not defined

第二种方式:

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

a = A()
print(a.list)

这种方式在Python2 中是可以的, 但是在Python3 里面是不行的。

第三种方式

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

上面代码在Python3 & Python2 的model级别都是通用的

第四种方式

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

print(list(gen))

这个也在python3 & python2 里面通用

仅仅当生成器作为类变量时,他会在类外部执行(因为在运行时会评估生成器), 并检查当前作用域中x的引用。 由于x在该范围内未初始化, 因此会引发错误

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值