পাইথন 2 কীভাবে স্ট্রিং এবং ইন্টের তুলনা করে? তালিকাগুলি কেন সংখ্যার চেয়ে বৃহত এবং তালিকার তুলনায় বৃহত্তর তুলনা করে?


178

নিম্নলিখিত স্নিপেটটি আউটপুট দিয়ে টীকাযুক্ত করা হয়েছে (আদর্শ আইটেম হিসাবে দেখা যায় ):

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 dups মধ্যে এই এক একটি উত্তর ব্যাখ্যা করেছেন কেন ভাষা এই ভাবে পরিকল্পনা করা হয়েছিল (এবং কেন এটা 3.x পুনরায় পরিকল্পনা করা হয়েছিল)। এটি এই প্রশ্নের অংশ নয়, তবে এখানে লিঙ্ক হওয়া অনেক প্রশ্নেরই একটি অংশ।
23:53

উত্তর:


209

থেকে পাইথন 2 ম্যানুয়াল :

সিপিথন বাস্তবায়ন বিশদ: সংখ্যা ব্যতীত বিভিন্ন ধরণের অবজেক্টগুলি তাদের প্রকারের নাম অনুসারে অর্ডার করা হয়; একই ধরণের জিনিসগুলি যা সঠিক তুলনা সমর্থন করে না তাদের ঠিকানায় আদেশ করা হয়েছে।

আপনি যখন দুটি স্ট্রিং বা দুটি সংখ্যার প্রকারের অর্ডার করেন তখন প্রত্যাশিত উপায়ে অর্ডারিং হয় (স্ট্রিংয়ের জন্য ডিক্সিকোগ্রাফিক অর্ডার, সংখ্যার জন্য সংখ্যাগত অর্ডারিং)।

আপনি যখন একটি সংখ্যাসূচক এবং একটি অ-সংখ্যািক প্রকার অর্ডার করেন, তখন সংখ্যার প্রকারটি প্রথম আসে।

>>> 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

এই আচরণটি কি ভাষা অনুসারে বাধ্যতামূলক, বা এটি বাস্তবায়নকারীদের উপর নির্ভর করে?

নেই কোনো ভাষা স্পেসিফিকেশনভাষা রেফারেন্স বলেছেন:

অন্যথায়, বিভিন্ন ধরণের অবজেক্টগুলি সর্বদা অসম তুলনা করে এবং ধারাবাহিকভাবে কিন্তু নির্বিচারে আদেশ করা হয়।

সুতরাং এটি একটি বাস্তবায়ন বিশদ।

বড় পাইথন বাস্তবায়নের কোনওটির মধ্যে কি পার্থক্য রয়েছে?

আমি এর জবাব দিতে পারছি না কারণ আমি কেবলমাত্র অফিসিয়াল সিপথন বাস্তবায়ন ব্যবহার করেছি, তবে পাইথন এর মতো পাইথনের অন্যান্য বাস্তবায়ন রয়েছে।

পাইথন ভাষার সংস্করণগুলির মধ্যে পার্থক্য রয়েছে?

পাইথন ৩.x-তে আচরণটি এমনভাবে পরিবর্তন করা হয়েছে যাতে পূর্ণসংখ্যা এবং স্ট্রিংয়ের আদেশ দেওয়ার চেষ্টা করা একটি ত্রুটি বাড়িয়ে তোলে:

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

55
এটি ভাল যে তারা এটি পি 3 কেতে পরিবর্তন করেছে। আমি যখন প্রথম এই প্রশ্নটি দেখেছিলাম তখন আমার চিন্তাভাবনাগুলি 'কী, এটি কোনও ত্রুটি বাড়ায় না?'
জাল

9
এনবি 2.x নিয়মের ব্যতিক্রম যে প্রকারের নাম অনুসারে বিভিন্ন ধরণের অর্ডার করা হয় তা হ'ল নন অবজেক্টটি সর্বদা অন্যান্য প্রকারের চেয়ে কম তুলনা করে। ৩.x তে অন্য কারও সাথে কারও তুলনা করা এখনও টাইপআরারের উত্থাপন করবে না।
ডেভ কার্বি

4
@ কারেলবিলিক: বুল একটি সংখ্যার প্রকার। এবং সত্য == 1 সুতরাং এটি <নয়> নয়।
অবার্নেট

3
তাদের টাইপ নামের লেক্সোগ্রাফিক ক্রম? আপনি কখনই এটি একটি বৈশিষ্ট্য হতে চান? কে কখনও এটি ব্যবহার করবে?
জ্যাক

3
মজার বিষয়: complex(1,0) > 'abc'হয় Falseকিন্তু complex(1,0) > complex(0,0)একটি উত্থাপনTypeError
এরিক Duminil

24

স্ট্রিংস হয় lexicographically তুলনায় এবং বিসদৃশ ধরনের তাদের টাইপ নামে তুলনা করা হয় ( "int"< "string")। 3.x দ্বিতীয় পয়েন্টটিকে তুলনামূলক অযোগ্য করে ঠিক করে।


3
কিন্তু পাইথন 2 ইনট্রে ডিক্টের চেয়ে কম তাই এটি নামের নাম দিয়ে কেবল অভিধান হিসাবে করা যায় না?
টনি সাফলক 66

আমি এই উত্তরটি পেরিয়ে এসেছি এবং টনি সাফলকের সাথে একমত হয়েছি। পৃথক হলে অবজেক্টগুলি টাইপ নামের দ্বারা অর্ডার করা হয় না।
এক্সিলিয়ান

@ টনিসফোকল66 সংখ্যার প্রকারটি এই নিয়মের ব্যতিক্রম। নিউমারিকটাইপ সর্বদা 2.7-তে অন্য যে কোনও ধরণের (নন টাইপ ব্যতীত) কম থাকে।
লে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.