मैं उनकी बेहतर समझ प्राप्त करने के लिए सूची समझ के साथ खेल रहा था और मैं कुछ अप्रत्याशित आउटपुट में भाग गया जो मैं समझाने में सक्षम नहीं हूं। मुझे यह सवाल पहले नहीं पूछा गया है, लेकिन यदि यह दोहराया गया प्रश्न है, तो मैं क्षमा चाहता हूं।पायथन: उन्नत नेस्टेड सूची समझ सिंटेक्स
मैं अनिवार्य रूप से जेनरेटर उत्पन्न करने वाले जेनरेटर लिखने की कोशिश कर रहा था। एक साधारण जनरेटर सूची समझ का उपयोग करता है इस प्रकार दिखाई देगा:
(x for x in range(10) if x%2==0) # generates all even integers in range(10)
मुझे क्या करना कोशिश कर रहा था एक जनरेटर है कि दो जनरेटर उत्पन्न लिखना था - की जो सीमा (10) में भी संख्या उत्पन्न पहले और दूसरे जिसमें से श्रेणी में विषम संख्या उत्पन्न हुई (10)। इस के लिए, मैंने किया था:
>>> (x for x in range(10) if x%2==i for i in range(2))
<generator object <genexpr> at 0x7f6b90948f00>
>>> for i in g.next(): print i
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <genexpr>
UnboundLocalError: local variable 'i' referenced before assignment
>>> g.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> g = (x for x in range(10) if x%2==i for i in range(2))
>>> g
<generator object <genexpr> at 0x7f6b90969730>
>>> g.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <genexpr>
UnboundLocalError: local variable 'i' referenced before assignment
मुझे समझ नहीं आता क्यों 'मैं' असाइनमेंट
मैंने सोचा कि यह i in range(2)
के साथ कुछ हो सकता था से पहले संदर्भित किया जा रहा है, इसलिए मैंने किया:
>>> g = (x for x in range(10) if x%2==i for i in [0.1])
>>> g
<generator object <genexpr> at 0x7f6b90948f00>
>>> g.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <genexpr>
UnboundLocalError: local variable 'i' referenced before assignment
यह मुझे समझ में नहीं आया, इसलिए मैंने सोचा कि पहले कुछ आसान करने का सबसे अच्छा प्रयास है। इसलिए मैं सूचियों में वापस चला गया और करने की कोशिश की:
>>> [x for x in range(10) if x%2==i for i in range(2)]
[1, 1, 3, 3, 5, 5, 7, 7, 9, 9]
जो मैं के रूप में ही होने की उम्मीद:
>>> l = []
>>> for i in range(2):
... for x in range(10):
... if x%2==i:
... l.append(x)
...
>>> l
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9] # so where is my list comprehension malformed?
लेकिन जब मैं एक कूबड़ पर यह कोशिश की, इस काम किया:
>>> [[x for x in range(10) if x%2==i] for i in range(2)]
[[0, 2, 4, 6, 8], [1, 3, 5, 7, 9]] # so nested lists in nested list comprehension somehow affect the scope of if statements? :S
तो मैंने सोचा कि यह समस्या हो सकती है कि if
कथन किस स्तर का दायरा चलाता है। इसलिए मैंने यह कोशिश की:
>>> [x for x in range(10) for i in range(2) if x%2==i]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
और अब मैं पूरी तरह उलझन में हूं। क्या कोई इस व्यवहार को समझा सकता है। मुझे समझ में नहीं आ रहा है कि मेरी सूची की समझ खराब क्यों प्रतीत होती है, और न ही मैं समझता हूं कि if
कथन का दायरा कैसे काम करता है।
किसी भी मदद होगी बहुत सराहना
धन्यवाद
पुनश्च: एक ओर जहां सवाल सबूत पढ़ने, मुझे एहसास हुआ कि यह एक होमवर्क सवाल जैसे दिखते हैं करता है कि - ऐसा नहीं है।
किया '[सीमा (10) में एक्स के लिए एक्स अगर एक्स% 2 == मैं रेंज में (2)] 'काम? मुझे 'NameError: name 'i' परिभाषित नहीं किया गया है '(पायथन 2.6.2) –
@ManojGovindan: मुझे वही मिलता है जो आपको मिला (पायथन 2.6.5) – inspectorG4dget
संबंधित: [पाइथन सूची समझ समझने के दायरे के बाद भी नाम रिबाइंड नाम । क्या यह सही है?] (Http://stackoverflow.com/q/4198906) –