2012-07-31 15 views
7

में एक सूची का परीक्षण कर रहा था, यह देखने के लिए कि यह खाली है या नहीं, मैं एक सूची का परीक्षण कर रहा था। आम तौर पर मैं लेन (सूची) == 0 का उपयोग करता हूं और मुझे थोड़ी देर पहले पढ़ना याद आया कि सूची खाली होने पर परीक्षण करने का सही तरीका यह था कि यह सच या गलत था।बूलियन पायथन

तो मैंने कोशिश की कि सूची गलत है, और यह गलत हो गया। शायद मुझे लगता है कि == का उपयोग करना है? नहीं, यह भी झूठी लौट आया। सूची सही है, सूची के रूप में गलत लौटा == सही।

अब मैं उलझन में हूँ तो मैं एक त्वरित गूगल करते हैं और अंत में: Best way to check if a list is empty

शीर्ष जवाब है:

if not a: 
    print "List is empty" 

तो मैं कुछ और चारों ओर खोज और अजगर के मैनुअल में खत्म जहां 4.1 राज्य:

किसी ऑब्जेक्ट को सत्य मूल्य के लिए परीक्षण किया जा सकता है, अगर किसी स्थिति में या नीचे की स्थिति में या नीचे बूलियन ऑपरेशंस के संचालन के लिए। निम्नलिखित मानों को झूठा माना जाता है:

कोई खाली अनुक्रम, उदाहरण के लिए, '',(), []।

अब मैं उलझन में हूं। यदि मैं एक सूची का परीक्षण करता हूं जैसे सूची नहीं है, तो यह ठीक काम करता है। लेकिन अगर एक खाली सूची गलत है, तो मैं सूची क्यों गलत नहीं कर सकता हूं या सूची == गलत है?

धन्यवाद

उत्तर

11

एक खाली सूची झूठी नहीं है, लेकिन जब आप इसे एक बूलियन में बदलने का है, यह गलत पर बदल देता है। dicts, tuples, तार, आदि .:

>>> [] == False 
False 
>>> bool([]) == False 
True 
>>> {} == False 
False 
>>> bool({}) == False 
True 

के लिए इसी तरह जब आप एक if खंड के हालत में कुछ डाल दिया, यह अपने बूलियन मान कि if के परीक्षण के लिए इस्तेमाल किया जाता है। यही कारण है कि if someListif bool(someList) जैसा ही है। इसी प्रकार, not foo कोई बूलियन नहीं करता है, इसलिए not [] सत्य के बराबर है।

+0

विशेष रूप से, [__nonzero__] (http://docs.python.org/reference/datamodel.html#object.%5F%5Fnonzero%5F%5F) विधि को विधि कहा जाता है – ernie

0

सूची की तुलना False पर करें, और सूची की सच्चाई या झूठ का परीक्षण करना वही बात नहीं है। एक खाली सूची False के बराबर नहीं है, लेकिन एक बूलियन संदर्भ में False के रूप में व्यवहार करती है। अजगर bool([]) == False में

print (bool([]) == False) # will print True 
print ([] == False) # will print False 
2

अन्य के रूप में कहा है,:

यहाँ यह कहने के लिए एक और तरीका है कि इस मेकअप भावना मदद कर सकता है है। पाइथन प्रोग्रामर द्वारा प्रायः एक चीज का शोषण किया जाता है कि ऑपरेटर and और or सही (गलत) वापस सही/गलत नहीं करते हैं। पर विचार करें निम्नलिखित:

3 and 4 #returns 4 
0 and 8 #returns 0 -- This is short-circuit evaluation 
0 or 8 #returns 8 
True or 0 #returns True -- This is short-circuit evaluation 

[] or False #returns False 
False or [] #returns [] 

क्या एक if बयान में ऐसा होता है कि हालत से ऊपर के रूप में मूल्यांकन किया जाता है और उसके बाद अजगर परोक्ष bool परिणाम पर कहता है - तो क्या आप के रूप में यह के बारे में सोच सकते हैं:

if condition: 
जहाँ तक अजगर का संबंध है

if bool(condition): 

:

रूप में एक ही बात है।इसी तरह not ऑपरेटर के लिए:

not condition 

not bool(condition) 
1

mylist is False साधन के रूप में एक ही बात "वस्तु mylistबिल्कुल एक ही वस्तुFalse के रूप में नामित किया गया है?" है

mylist == False का अर्थ है "के लिएFalse?

not mylist का मतलब वस्तु mylistबराबर नामित है" वस्तु नामित mylist falsily व्यवहार करते है? इनमें से


कोई नहीं के बराबर हैं: 1 is not 1.0 लेकिन 1 == 1.0 और [] != False लेकिन not [] is True

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