2013-06-06 11 views
6
>>> [l for l in range(2,100) if litheor(l)!=l in sieve(100)] 
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97] 
>>> 2 in sieve(100) 
True 
>>> litheor(2) 
True 

तो litheor(2)True और 2 in sieve(100)True है है, इसलिए सूची समझ में if खंड False है। लेकिन सूची की समझ के आउटपुट में अभी भी 2 क्यों है?पायथन: सूची समझ में कहीं कुछ गलत हो गया?

उत्तर

11

ठीक है, पहले यह पागलपन लगता है, लेकिन है:

>>> ast.dump(ast.parse("True != 2 in [2,3,5]")) 
"Module(body=[Expr(value= 
Compare(left=Name(id='True', ctx=Load()), ops=[NotEq(), In()], comparators=[Num(n=2), List(elts=[Num(n=2), Num(n=3), Num(n=5)], ctx=Load())]) 
)])" 

:

>>> True != 2 in [2,3,5] 
True 
>>> (True != 2) in [2,3,5] 
False 
>>> True != (2 in [2,3,5]) 
False 

जब आप महसूस करते हैं कि यह एक सरल पूर्वता मुद्दा नहीं है, एएसटी को देख एकमात्र शेष विकल्प है

>>> ast.dump(ast.parse("1 < 2 <= 3")) 
'Module(body=[Expr(value= 
Compare(left=Num(n=1), ops=[Lt(), LtE()], comparators=[Num(n=2), Num(n=3)]) 
)])' 

तो, यह पता चला है, True != 2 in [2,3,5] समान व्याख्या की है: और यहाँ एक छोटे से संकेत है 1 < 2 <= 3 पर। और अपने अभिव्यक्ति

litheor(l) != l in sieve(100) 

मतलब है

litheor(l) != l and l in sieve(100) 

जो True है।

+0

धन्यवाद। 1, हालांकि, चलनी में नहीं है (100)। क्या कोई और चीज गलत हो सकती है? –

+0

@SylvesterVLowell Well, निम्न में से एक हो सकता है: 1) 'चलनी (100)' जिसमें न केवल पूर्णांक होते हैं बल्कि बूलियन 'ट्रू' भी होते हैं; 2) 'लिथियर (2)' बूलियन और 'चलनी (100) '' '' के बजाय '2' लौटा रहा है। मैं कोई अन्य विकल्प नहीं देख सकता। क्या आप हमें 'चलनी' और 'लिथियर' की अपनी परिभाषा दिखा सकते हैं, कृपया? – kirelagin

+0

@SylvesterVLowell ओह रुको ... आप सही हैं ... यह पूरी तरह पागल है ... – kirelagin

संबंधित मुद्दे