पायथन 2 कैसे स्ट्रिंग और इंट की तुलना करता है? सूचियों की संख्या की तुलना में अधिक क्यों है, और सूचियों की तुलना में अधिक ट्यूपल हैं?


178

निम्न स्निपेट को आउटपुट के साथ एनोटेट किया गया है ( जैसा कि ideone.com पर देखा गया है ):

print "100" < "2"      # True
print "5" > "9"        # False

print "100" < 2        # False
print 100 < "2"        # True

print 5 > "9"          # False
print "5" > 9          # True

print [] > float('inf') # True
print () > []          # True

क्या कोई समझा सकता है कि आउटपुट ऐसा क्यों है?


कार्यान्वयन का विवरण

  • क्या यह व्यवहार भाषा की युक्ति द्वारा अनिवार्य है, या यह कार्यान्वयनकर्ताओं पर निर्भर है?
  • क्या किसी भी प्रमुख पायथन कार्यान्वयन के बीच अंतर हैं?
  • क्या पायथन भाषा के संस्करणों के बीच अंतर हैं?

23
इस प्रश्न के 3000 डुप्लिकेट्स में से, इस एक का उत्तर है कि यह समझाने के लिए कि भाषा को इस तरह से क्यों बनाया गया था (और इसे 3.x में फिर से क्यों बनाया गया था)। यह इस सवाल का हिस्सा नहीं है, लेकिन यहां से जुड़े कई सवालों का हिस्सा है।
abarnert

जवाबों:


209

से अजगर 2 मैनुअल :

CPython कार्यान्वयन विवरण: संख्याओं को छोड़कर विभिन्न प्रकारों की वस्तुओं को उनके प्रकार के नामों द्वारा आदेशित किया जाता है; समान प्रकार की वस्तुएं जो उचित तुलना का समर्थन नहीं करती हैं, उनके पते द्वारा आदेशित हैं।

जब आप दो तार या दो संख्यात्मक प्रकार का ऑर्डर करते हैं तो ऑर्डरिंग अपेक्षित तरीके से की जाती है (स्ट्रिंग के लिए लेक्सिकोग्राफ़िक ऑर्डरिंग, पूर्णांक के लिए संख्यात्मक ऑर्डरिंग)।

जब आप एक संख्यात्मक और एक गैर-संख्यात्मक प्रकार का आदेश देते हैं, तो संख्यात्मक प्रकार पहले आता है।

>>> 5 < 'foo'
True
>>> 5 < (1, 2)
True
>>> 5 < {}
True
>>> 5 < [1, 2]
True

जब आप दो असंगत प्रकारों का आदेश देते हैं, जहां न तो संख्यात्मक होते हैं, तो वे उनके टाइपनामों के वर्णानुक्रम द्वारा आदेशित होते हैं:

>>> [1, 2] > 'foo'   # 'list' < 'str' 
False
>>> (1, 2) > 'foo'   # 'tuple' > 'str'
True

>>> class Foo(object): pass
>>> class Bar(object): pass
>>> Bar() < Foo()
True

एक अपवाद पुरानी शैली की कक्षाएं हैं जो हमेशा नई शैली की कक्षाओं से पहले आती हैं।

>>> class Foo: pass           # old-style
>>> class Bar(object): pass   # new-style
>>> Bar() < Foo()
False

क्या यह व्यवहार भाषा की युक्ति द्वारा अनिवार्य है, या यह कार्यान्वयनकर्ताओं पर निर्भर है?

नहीं है कोई भाषा विनिर्देशभाषा संदर्भ का कहना है:

अन्यथा, विभिन्न प्रकारों की वस्तुएं हमेशा असमान की तुलना करती हैं, और लगातार लेकिन मनमाने ढंग से ऑर्डर की जाती हैं।

तो यह एक कार्यान्वयन विवरण है।

क्या किसी भी प्रमुख पायथन कार्यान्वयन के बीच अंतर हैं?

मैं इसका उत्तर नहीं दे सकता क्योंकि मैंने केवल आधिकारिक CPython कार्यान्वयन का उपयोग किया है, लेकिन Python के अन्य कार्यान्वयन भी हैं जैसे PPPy।

क्या पायथन भाषा के संस्करणों के बीच अंतर हैं?

पायथन 3.x में व्यवहार को बदल दिया गया है ताकि पूर्णांक और एक स्ट्रिंग को क्रम में लाने का प्रयास एक त्रुटि उठाएगा:

>>> '10' > 5
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    '10' > 5
TypeError: unorderable types: str() > int()

55
यह अच्छा है कि उन्होंने इसे Py3k में बदल दिया। जब मैंने पहली बार यह प्रश्न देखा, तो मेरे विचार थे 'क्या, यह एक त्रुटि नहीं बढ़ाता है?'।
JAL

9
एनबी 2.x नियम का एक अपवाद है कि विभिन्न प्रकार के नाम से आदेश दिया जाता है कि कोई भी वस्तु हमेशा हर दूसरे प्रकार से कम की तुलना नहीं करती है। 3.x में किसी अन्य प्रकार के साथ तुलना करना अभी भी एक TypeError बढ़ाएगा।
डेव किर्बी

4
@ केरेलबाइलक: बूल एक संख्यात्मक प्रकार है। और सच == 1 तो यह न तो <और न ही> है।
अष्टकूट

3
उनके प्रकार के नामों का लेक्सोग्राफ़िक क्रम? आप कभी भी यह कैसे चाहते हैं कि यह एक विशेषता हो? कौन कभी उसका उपयोग करेगा?
जैक

3
मज़ेदार तथ्य: complex(1,0) > 'abc'है Falseलेकिन complex(1,0) > complex(0,0)एक को जन्म देती हैTypeError
एरिक Duminil

24

स्ट्रिंग्स की तुलना लेक्सिकोग्राफिक रूप से की जाती है, और डिसिमिलर प्रकार की तुलना उनके प्रकार ( "int"< "string") के नाम से की जाती है । 3.x उन्हें गैर-तुलनीय बनाकर दूसरे बिंदु को ठीक करता है।


3
लेकिन python2 int में dicts से कम हैं इसलिए यह केवल प्रकार के नाम से lexicographically नहीं हो सकता है?
टोनी सफ़ोकल 66

मैं बस इस जवाब पर आया और टोनी सफ़ोक से सहमत हूं। असंतुष्ट होने पर टाइप नाम से ऑब्जेक्ट ऑर्डर नहीं किए जाते हैं।
निर्गमन

@ TonySuffolk66 संख्यात्मक प्रकार उस नियम के लिए अपवाद है। न्यूमेरिक टाइप हमेशा 2.7 में (किसी भी प्रकार को छोड़कर) किसी भी अन्य प्रकार से कम होता है।
lef
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.