में इवल स्कोप पाइथन 3 में विचित्र eval व्यवहार में आया - स्थानीय चर को तब तक नहीं लिया जाता जब सूची समझ में eval कहा जाता है। अजगर 3 मेंपाइथन 2 बनाम 3
def apply_op():
x, y, z = [0.5, 0.25, 0.75]
op = "x,y,z"
return [eval(o) for o in op.split(",")]
print(apply_op())
यह त्रुटियों:
▶ python --version
Python 3.4.3
▶ python eval.py
Traceback (most recent call last):
File "eval.py", line 7, in <module>
print(apply_op())
File "eval.py", line 5, in apply_op
return [eval(o) % 1 for o in op.split(",")]
File "eval.py", line 5, in <listcomp>
return [eval(o) % 1 for o in op.split(",")]
File "<string>", line 1, in <module>
NameError: name 'x' is not defined
और यह अजगर 2 में ठीक काम करता है:
▶ python --version
Python 2.7.8
▶ python eval.py
[0.5, 0.25, 0.75]
सूची समझ के बाहर स्थानांतरित करना समस्या को हटा।
def apply_op():
x, y, z = [0.5, 0.25, 0.75]
return [eval("x"), eval("y"), eval("z")]
क्या यह इरादा व्यवहार है, या यह एक बग है?
[यहां] (http://stackoverflow.com/questions/4198906/python-list-comprehension-rebind-names-even- बाद के दायरे की समझ-थी-थी) पी 2 और पी 3 में स्कॉप्स और सूची की समझ के बारे में कुछ और जानकारी है। – Marcin
मजेदार हिस्सा है, इसे फ़ंक्शन स्कोप से बाहर ले जाना भी समस्या को रोक देता है। संबंधित: http://bugs.python.org/msg81898 – wim
@ मार्सिन यह सूची समझ के बाहर लूप वैरिएबल लीकिंग के दायरे से संबंधित नहीं है। यह लूप वैरिएबल * के भीतर * समझ के भीतर ही है। – wim