2015-02-01 7 views
5

एक ValueError: cannot convert float NaN to integer वापस ट्रेसिंग मुझे पता चला है कि रेखा:पायथन अधिकतम ('ए', 5) स्ट्रिंग मान क्यों देता है?

max('a', 5) 
max(5, 'a') 

उपरोक्त मामले मैं उदाहरण स्ट्रिंग a इस्तेमाल किया, लेकिन मेरी वास्तविक मामले में a के बजाय 5.

वापस आ जाएगी स्ट्रिंग एक है NaN (एक फिटिंग प्रक्रिया का परिणाम जो अभिसरण करने में असफल रहा)।

इस व्यवहार के पीछे तर्क क्या है? पाइथन स्वचालित रूप से क्यों पहचानता है कि वहां एक स्ट्रिंग है और उसे संख्या वापस करनी चाहिए?

इससे भी अधिक उत्सुक के रूप में उम्मीद है कि min() काम करता है के बाद से:

min('a', 5) 
min(5, 'a') 

रिटर्न 5

+2

संबंधित: [क्यों पाइथन में सबसे छोटा नहीं है?] (Http: // stackoverflow।कॉम/क्यू/22040724) –

+1

संभव डुप्लिकेट [पायथन स्ट्रिंग और int की तुलना कैसे करता है?] (http://stackoverflow.com/questions/3270680/how-does-python-compare-string-and-int) – lightandlight

उत्तर

11

अजगर 2 में, संख्यात्मक मान हमेशा तरह से पहले तार और लगभग सभी अन्य प्रकार:

>>> sorted(['a', 5]) 
[5, 'a'] 

नंबर तो, छोटे तार से माना जाता है। max() का उपयोग करते समय, इसका मतलब है कि स्ट्रिंग को किसी संख्या पर चुना जाता है।

वह संख्याएं छोटी हैं मनमाने ढंग से कार्यान्वयन विकल्प है। देखें Comparisons documentation:

ऑपरेटरों <, >, ==, >=, <=, और != दो वस्तुओं के मूल्यों की तुलना करें। वस्तुओं को एक ही प्रकार की आवश्यकता नहीं है। यदि दोनों संख्याएं हैं, तो वे एक सामान्य प्रकार में परिवर्तित हो जाते हैं। अन्यथा, विभिन्न प्रकार की वस्तुओं हमेशा असमान की तुलना करते हैं, और मनमाने ढंग से लेकिन मनमाने ढंग से आदेश दिया जाता है।

बोल्ड जोर मेरा है।

पायथन 2 ने विषम प्रकारों को क्रमबद्ध करने के लिए वास्तविक मेहनत की कोशिश की, जिसके कारण समस्याओं को डीबग करने में बहुत मेहनत हुई है, जैसे प्रोग्रामर स्ट्रिंग के साथ पूर्णांक की तुलना करने और अप्रत्याशित परिणाम प्राप्त करने की कोशिश कर रहे हैं। पायथन 3 ने इस गलती को सही किया; यहां तक ​​कि re-implemented the Python 2 rules for Python 3

>>> max(5, 'a') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unorderable types: str() > int() 

मैं written elsewhere about the ordering rules है, और, यदि आप वास्तव में उन वापस चाहता था: यदि आप एक TypeError बजाय मिल जाएगा।

+0

मैं ' मीटर डाउनवॉटर नहीं है, लेकिन यह ** ** सत्य नहीं है कि "संख्यात्मक मान हमेशा अन्य प्रकारों से पहले क्रमबद्ध होते हैं" - उदाहरण के लिए 'क्रमबद्ध (कोई नहीं, 23])' और आप अक्सर 'कोई नहीं' पहले देखेंगे यह एक संख्यात्मक प्रकार का नहीं है। यह ** ** है, या बल्कि ** ** एक बार पीई 2 इतिहास है, वास्तव में मनमाने ढंग से निर्णय –

+0

@AlexMartelli: कोई भी एकमात्र अपवाद नहीं है; हालांकि मैं नियमों का पूरा सेट नहीं रखना चाहता था। मैं एक ऐसे उत्तर से लिंक करूंगा जहां मैंने गहराई से जाना था। विकल्प एक बार मनमाने ढंग से थे, वास्तव में, लेकिन चूंकि वे तब से नहीं बदल पाए हैं, बल्कि पत्थर में स्थापित हैं। :-) –

+1

@AlexMartelli: उद्घाटन वाक्य में खराब शब्द समायोजित किया। –

2

सीपीथॉन 2.x तारों में हमेशा संख्याओं से अधिक होते हैं, यही कारण है कि आप उन व्यवहारों को देखते हैं।

ओटीओएच, मुझे नहीं लगता कि 5 "स्पष्ट रूप से" "ए" से अधिक क्यों है ... विभिन्न प्रकार के मान केवल सुविधा के लिए तुलनीय हैं (उदाहरण के लिए यदि आप एक आरबी पेड़ बना रहे हैं तो आप विषम कुंजी के साथ सब कुछ तुलनीय होना चाहते हैं), और ऐसी तुलना सख्त कमजोर क्रम को परिभाषित करती है, लेकिन अंतर-प्रकार की तुलना किसी भी तरह से समझदार नहीं है (आप किसी संख्या को स्ट्रिंग या ऑब्जेक्ट से कैसे तुलना करते हैं?), बस सुसंगत है।

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