変数とジェネレータが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)を実行し、それは言う:私が実行したときにはPython 3では
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
を、それが、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にうまく機能またはコードが過度のPython 2とPython 3にうまく機能
from __future__ import print_function
x = 4
gen = (x for _ in range(3))
print(list(gen))
モジュールレベルでのように機能します。
なぜclass
で間違っていますか?
'はクラス外で実行され(実行時にジェネレータが評価されるため)、現在のスコープ**内のx **の参照を調べます。これを参照してくださいhttp://ideone.com/bgef81結果は[6,6,6]ではなく、[5,5,5]、なぜですか? – WeizhongTu