1. 程式人生 > >關於生成器在類中作用域混亂的問題

關於生成器在類中作用域混亂的問題

第一種方式:

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在該範圍內未初始化, 因此會引發錯誤