মিথ্যা == 0 এবং সত্য == 1 একটি বাস্তবায়নের বিশদ বা ভাষা দ্বারা এটি গ্যারান্টিযুক্ত?


244

পাইথনে এটি কি False == 0এবং গ্যারান্টিযুক্ত True == 1(ধরে নিলেন যে তারা ব্যবহারকারী দ্বারা পুনরায় নিয়োগ দেওয়া হয়নি)? উদাহরণস্বরূপ, কোনও উপায়ে কি গ্যারান্টিযুক্ত যে নীচের কোডটি সর্বদা একই ফলাফল আনবে, পাইথনের সংস্করণ যাই হোক না কেন (বিদ্যমান এবং সম্ভবত, ভবিষ্যতের উভয়ই)?

0 == False  # True
1 == True   # True
['zero', 'one'][False]  # is 'zero'

অফিসিয়াল ডকুমেন্টেশনের কোনও রেফারেন্স অনেক প্রশংসা হবে!

সম্পাদনা : অনেক boolউত্তরে উল্লিখিত হিসাবে, উত্তরাধিকার সূত্রে int। সুতরাং প্রশ্নটি পুনরায় সংশোধন করা যেতে পারে: "ডকুমেন্টেশনটি কি আনুষ্ঠানিকভাবে বলেছে যে প্রোগ্রামাররা মানগুলি 0এবং1 সংখ্যার সাথে পূর্ণসংখ্যার বুলিয়ানদের উপর নির্ভর করতে পারে ?" এই প্রশ্নটি কার্যকর কোড লেখার জন্য প্রাসঙ্গিক যা প্রয়োগের বিশদগুলির কারণে ব্যর্থ হবে না!


63
@ এস.লোট: উপরের প্রশ্নটি জিজ্ঞাসা করার অনেক কারণ রয়েছে। সুতরাং, উদাহরণস্বরূপ রয়েছে যে বুলিয়ানের পূর্ণসংখ্যার উপর নির্ভর করা আপনার কোডকে আরও সহজ করে তোলে: আপনার কি এটিকে পরিবর্তন করতে হবে? অথবা, আপনি অন্য কারও দ্বারা লিখিত কোডে স্থানগুলি খুঁজে পেতে পারেন যা বুলিয়ানদের পূর্ণসংখ্যার উপর নির্ভর করে: বিদ্যমান কোডটি "ফিক্স" করার জন্য আপনি কোডটিতে যা পরিবর্তন করছেন তা বাধা দিচ্ছেন, বা আপনি নিশ্চিতভাবে বিশ্রাম নিতে পারবেন যে বর্তমান কোডিংটি শোনানো হয়েছে? ? অন্যান্য উদাহরণের আধিক্য রয়েছে। আরও সাধারণভাবে, গেমের নিয়মগুলি জানা ভাল, যাতে আপনি এটি ভালভাবে খেলতে পারেন এবং একটি সাউন্ড উপায়ে প্রোগ্রাম করতে পারেন।
এরিক হে লেবিগোট

10
@ এস.লোট: মূল পোস্টটি আপনার বক্তব্যকে যথাযথভাবে প্রতিধ্বনিত করে: প্রশ্নটি মূলত "এটি কি বাস্তবায়নের বিশদ?", কারণ বাস্তবায়নের বিশদগুলির উপর নির্ভর করা উচিত নয় এমন ধারণা সম্পর্কে আমি আপনার সাথে পুরোপুরি একমত। যদি বুলিয়ানরা আনুষ্ঠানিকভাবে জ্ঞাত মানগুলির পূর্ণসংখ্যা হয়, তবে প্রশ্নের কোডটি প্রয়োগের বিশদগুলির উপর নির্ভর করে না, যা ভাল।
এরিক হে লেবিগোট

5
@S। লট: যে মিথ্যা == 0 এবং সত্য == 1 জেনে একটি ক্রমের কতগুলি বাল সত্য তা গণনা করা সহজ করে তোলে: আপনি কেবল লিখতে পারেন sum(bool_list)। অন্যথায়, আপনি লিখতে হবে sum(1 for x bool_list if x)
dan04

8
@ লাডান: এটি বুলিয়ান গণনার এক উপায়। আমি bool_list.count(True)এটি আরও সুস্পষ্ট বলব ; এটি প্রায় 3 গুণ দ্রুত ... :)
এরিক ও লেবিগট

2
@akonsu উত্তর দেখান হিসাবে, পাইথন Booleans হয় আসলে পূর্ণসংখ্যার (একটি নির্দিষ্ট উপশ্রেণী)। উপরন্তু, পাইথন স্পষ্টত হয়েছে ধরনের; সম্ভবত আপনি বোঝাতে চেয়েছেন যে এটি "স্ট্যাটিকালি টাইপড নয়"? এছাড়াও, আমি নিশ্চিত না যে আপনি "আমি কোডে ত্রুটি করব না" বলতে কী বোঝায়। এখন, আমি কখনই বুলেটগুলি পূর্ণসংখ্যার সাথে মিশ্রিত করতে পছন্দ করি না, কারণ সেগুলি ধারণাগতভাবে আলাদা। এবং পাইথন বুলিয়ানগুলি পূর্ণসংখ্যা না হলে আমি কিছু মনে করব না তবে 0 এবং 1 এর মান সহকারে সেগুলি রয়েছে তা জেনে রাখা কার্যকর।
এরিক হে লেবিগোট

উত্তর:


183

পাইথন ২.x এ এটি নয় নিশ্চিত যেহেতু জন্য Trueএবং Falseপুনরায় নির্ধারণ করা হবে। যাইহোক, এটি ঘটলেও, বুলিয়ান ট্রু এবং বুলিয়ান মিথ্যা এখনও তুলনার জন্য যথাযথভাবে ফিরে আসে।

পাইথন 3.x এ Trueএবং Falseকীওয়ার্ডগুলি সর্বদা সমান হবে1 এবং 0

পাইথন 2 এ এবং সর্বদা পাইথন 3 এ সাধারণ পরিস্থিতিতে:

Falseঅবজেক্ট টাইপের boolযা একটি সাবক্লাস int:

object
   |
 int
   |
 bool

আপনার উদাহরণে এটি কাজ করার একমাত্র কারণ ['zero', 'one'][False]। এটি এমন কোনও বস্তুর সাথে কাজ করবে না যা পূর্ণসংখ্যার সাবক্লাস নয়, কারণ তালিকা সূচক কেবলমাত্র পূর্ণসংখ্যার সাথে কাজ করে বা এমন কোনও পদার্থ যা কোনও __index__পদ্ধতি সংজ্ঞায়িত করে (ধন্যবাদ মার্ক-ডিকিনসন )।

সম্পাদনা:

এটি বর্তমানে অজগর সংস্করণ এবং পাইথন ৩-এর ক্ষেত্রে সত্য p পাইথন ২.6 এর ডকস এবং পাইথন ৩-এর ডক্স উভয়ই বলে:

দুটি ধরণের পূর্ণসংখ্যা রয়েছে: [...] পূর্ণসংখ্যা (প্রাক্তন) [...] বুলিয়ান (বুল)

এবং বুলিয়ান উপবিচ্ছেদে:

বুলিয়ানস: এগুলি সত্যের মানগুলি মিথ্যা এবং সত্যের প্রতিনিধিত্ব করে [...] বুলিয়ান মানগুলি যথাক্রমে 0 এবং 1 এর মানগুলির মতো আচরণ করে, প্রায় সমস্ত প্রসঙ্গে, ব্যতিক্রমটি স্ট্রিংয়ে রূপান্তরিত হওয়ার পরে, "মিথ্যা" বা "সত্য" "যথাক্রমে ফিরে আসে।

পাইথন 2 এর জন্যও রয়েছে :

সংখ্যাগত প্রসঙ্গে (উদাহরণস্বরূপ যখন একটি গণিত অপারেটরের যুক্তি হিসাবে ব্যবহৃত হয়), তারা [মিথ্যা এবং সত্য] যথাক্রমে 0 এবং 1 এর পূর্ণসংখ্যার মতো আচরণ করে।

সুতরাং বুলিয়ানগুলি স্পষ্টভাবে পাইথন ২.6 এবং 3 এ পূর্ণসংখ্যা হিসাবে বিবেচিত হয়।

পাইথন 4 না আসা পর্যন্ত আপনি নিরাপদ। ;-)


2
0 == 0.0 সত্য ফিরে আসে [[শূন্য ',' এক '] [0.0] ব্যর্থ হয়। ['শূন্য', 'এক'] [মিথ্যা] কাজ করে কারণ বুল ইন্টের একটি সাবক্লাস। (প্রাক্তন .__ সাবক্লাস __ () ফিরে আসে [<টাইপ 'বুল'>]]
লু

20
নিতপিক: যে কোনও অবজেক্ট যা একটি __index__পদ্ধতি সরবরাহ করে তা তালিকা সূচক হিসাবে ব্যবহার করা যেতে পারে; intবা কেবলমাত্র সাবক্লাস নয় long
মার্ক ডিকিনসন

আহ্ হ্যাঁ, ওখানেও আছে। তবে পাইথন 3.0 ডকুমেন্টেশনের সাথে লিঙ্ক না করাই ভাল হবে: 3.0 মারা গেছে। :)
মার্ক ডিকিনসন

4
পুনরায়: "পাইথন ২.x এ এটির গ্যারান্টি দেওয়া হয় না কেননা সত্য এবং মিথ্যা পুনরায় নিয়োগ দেওয়া সম্ভব হয়"। আইএমএইচও, যদিও এটি সত্য, যে কেউ সত্য বা মিথ্যা পুনর্নির্দিষ্ট করেন তিনি যে কোনও অদ্ভুত পরিণতি পাবার প্রাপ্য। বিশেষত, পুনরায় নিয়োগের পূর্বে ট্রু সংরক্ষণ করা এবং পুনরায় নিয়োগের পরে ফলাফলের সাথে সত্যের তুলনা করলে তা ভেঙে যায়। a = True; True = 'i am an idiot'; a == True=> মিথ্যা। এ জাতীয় পুনর্নির্মাণ ব্যতীত ডিফল্ট মানগুলি 0 এবং 1 হিসাবে মানক করা হয় এবং আমি বিশ্বাস করি যে এটির উপর নির্ভর করা সাধারণ অভ্যাস; উদাহরণস্বরূপ একটি দ্বি-উপাদান অ্যারেতে সূচক করা, যেখানে [0] মিথ্যা কেস ধরে রাখে, [1] সত্য।
টুলমেকারস্টেভ

: আমি শুধুমাত্র সত্য বাস্তবে সত্য করতে পারেন 1 এবং মিথ্যা 0 মত বিবেচনা করা যেতে পারে, আরেকটি সরকারী নিশ্চিতকরণ খেয়াল docs.python.org/2/library/stdtypes.html#boolean-values । আমি এই উত্তরে এটি যুক্ত করছি।
এরিক হে লেবিগোট

78

পাইথন ২.৩-তে নতুন বুল টাইপ নিয়ে আলোচনা করা পিইপি-এর লিঙ্ক: http://www.python.org/dev/peps/pep-0285/

কোনও বোলকে কোন ইনটে রূপান্তর করার সময় পূর্ণসংখ্যার মান সর্বদা 0 বা 1 হয় তবে কোনও ইনটকে একটি বুলে রূপান্তর করার সময়, বুলিয়ান মানটি 0 ব্যতীত সমস্ত পূর্ণসংখ্যার জন্য সত্য।

>>> int(False)
0
>>> int(True)
1
>>> bool(5)
True
>>> bool(-5)
True
>>> bool(0)
False

22

পাইথন ২.x এ এটির কোনও গ্যারান্টি নেই:

>>> False = 5
>>> 0 == False
False

সুতরাং এটি পরিবর্তন হতে পারে। পাইথন 3.x এ, সত্য, মিথ্যা এবং কিছুই নেই সংরক্ষিত শব্দ নয় , সুতরাং উপরের কোডটি কাজ করবে না।

সাধারণভাবে, বুলিয়ানগুলির সাথে আপনার ধরে নেওয়া উচিত যে মিথ্যাটির সর্বদা 0 এর পূর্ণসংখ্যার মান থাকবে (যতক্ষণ না আপনি এটি পরিবর্তন করেন না, যতক্ষণ না উপরে হিসাবে), সত্যটির অন্য কোনও মান থাকতে পারে। আমি অগত্যা কোনও গ্যারান্টির উপর নির্ভর করব না True==1, তবে পাইথন ৩.x-তে, সর্বদা এটি হবে, তা যাই হোক না কেন।


3
পুনরায় "সত্যের অন্য কোনও মান থাকতে পারে I আমি সত্য == 1" এর কোনও গ্যারান্টির উপর নির্ভর করি না। প্রকৃতপক্ষে, আপনি পাইথন.আর. / দেবদেব / পেপস / পেপ ০২৮৮ অনুসারে সত্য == ১ এর উপর নির্ভর করতে পারেন এবং স্পষ্ট ডকস.পিথন.অর্গ / / রেফারেন্স / "বুলিয়ান মানগুলি যথাক্রমে 0 এবং 1 এর মানগুলির সাথে আচরণ করে , প্রায় সমস্ত প্রসঙ্গে ... "আমি সত্য বা মিথ্যা পুনরায় অর্পণ করে পাই 2 এ এটিকে ওভাররাইড করা অসম্ভব বলে বলছি না, তবে আমি বলছি যে আপনার প্রকল্পের কোনও প্রোগ্রামার যদি একজন নির্বোধ না হয় এবং এ জাতীয় পুনরায় নিয়োগ না করে, আচরণ গ্যারান্টিযুক্ত।
টুলমেকারস্টেভ

-2

খুব সহজ. যেহেতু বুল একটি পূর্ণসংখ্যা হিসাবে একটি বুল হিসাবে মূল্যায়ন করে, কেবলমাত্র শূন্য একটি মিথ্যা উত্তর দেয়। সমস্ত নন-জিরো মান, ভাসমান, পূর্ণসংখ্যা, নেতিবাচক সংখ্যা সহ বা আপনার কাছে যা আছে, সত্য ফিরে আসবে।

এটি কেন কার্যকর তার একটি দুর্দান্ত উদাহরণ কোনও ডিভাইসের পাওয়ারের স্থিতি নির্ধারণ করা। অন ​​কোনও শূন্য মান, বন্ধ শূন্য হয়। বৈদ্যুতিনভাবে এটি বোধগম্য হয়।

মানগুলির মধ্যে তুলনামূলকভাবে সত্য বা মিথ্যা নির্ধারণ করতে আপনার সাথে এটির তুলনা করার কিছু থাকতে হবে। এই স্ট্রিং এবং নম্বর মান প্রযোজ্য, ব্যবহার ==বা !=বা <, > >=, <=, ইত্যাদি

আপনি একটি ভেরিয়েবলের জন্য একটি পূর্ণসংখ্যা বরাদ্দ করতে পারেন এবং তারপরে এই ভেরিয়েবল মানের উপর ভিত্তি করে সত্য বা মিথ্যা পেতে পারেন।


1
সত্যটি কিনা == 1 পাইথন দ্বারা গ্যারান্টিযুক্ত কিনা এটি সম্পর্কে, পূর্বেসংখ্যার বুলিয়ান মান সম্পর্কে নয়।
এরিক হে লেবিগোট

-3

শুধু লিখুন int(False)এবং আপনি পাবেন 0, আপনি int(True)এটি টাইপ করলে আউটপুট হবে1


4
এর একমাত্র অর্থ হ'ল মিথ্যা এবং সত্যটি int()একটি সাধারণ সংখ্যাসূচক অর্থ সহ বৈধ ইনপুটগুলির সাথে বৈধ ইনপুট , 0 এবং 1 এর সাথে একেবারে অভিন্ন বলে নয়
এরিক ও লেবিগোট

-5

মিথ্যা একটি বুল হয়। এটির একটি আলাদা ধরণ রয়েছে। এটি 0 থেকে পৃথক অবজেক্ট যা একটি পূর্ণসংখ্যা।

0 == Falseসত্য প্রত্যাবর্তন করে কারণ মিথ্যাটি পূর্ণসংখ্যায় ফেলে দেওয়া হয়। int (মিথ্যা) 0 প্রদান করে

== অপারেটরের অজগর ডকুমেন্টেশন বলেছেন (সহায়তা ('==')):

অপারেটার <, >, ==, >=, <=, এবং !=মান দুটি বস্তুর তুলনা করুন। বস্তুর একই ধরণের প্রয়োজন নেই। যদি উভয়ই সংখ্যা হয় তবে এগুলি একটি সাধারণ ধরণে রূপান্তরিত হয়।

ফলস্বরূপ মিথ্যাটিকে তুলনার প্রয়োজনের জন্য পূর্ণসংখ্যায় রূপান্তরিত করা হয়। তবে এটি 0 থেকে পৃথক।

>>> 0 is False
False

26
এই দাবীটা ঠিক নয় boolএকটি উপশ্রেণী হয় intতাই একটি খুব বাস্তব অর্থে একটি bool, হয় একটি পূর্ণসংখ্যা। উদাহরণস্বরূপ, isinstance(True, int)সত্য প্রদান করে। এবং সাম্যতার চেকটি বুলকে কোন ইনটে রূপান্তরিত করে না, যেহেতু কোনও রূপান্তর প্রয়োজন নয়: এটি কেবল int.__cmp__সরাসরি কল করে। নোট যা bool.__cmp__ is int.__cmp__মূল্যায়নও True
মার্ক ডিকিনসন

3
এই উত্তরের জন্য -1। বুল এবং ইন্টের মধ্যে সম্পর্কের ভুল বর্ণনা (পাইথন 2 এ)। isinstance(True, int)=> সত্য। অর্থাৎ সত্য IS একটি পূর্ণসংখ্যা, এবং রূপান্তর প্রয়োজন হয় না।
নির্মাতা স্টিভ

আমার কাছে একটি স্ক্রিপ্ট ছিল যা ফলস বা কোনও আন্ত ... ফিরিয়ে দিয়ে while response is Falseকাজ করেছিল, এবং করল while response == Falseনা .. ধন্যবাদ!
কোঁকড়ানো_ বন্ধনী 19

5
যে 0 is Falseমিথ্যা তুমি কিছুই বলে। আপনার ইন্টারেক্টিভ অনুবাদক সালে লিখুন x = -10, তারপর y = -10, তারপর x is yএবং যে করব এছাড়াও মিথ্যা হতে। ঠিক ঠিক কারণ যেখানে পাইথন ইন্টারপ্রেটার নির্দিষ্ট পরিস্থিতিতে একই পূর্ণসংখ্যার বস্তুগুলিকে পুনরায় ব্যবহার করে (ছোট পূর্ণসংখ্যাকে ইন্টার্নিয়ার হিসাবে পূর্ণসংখ্যার অক্ষর সংরক্ষণ করে) এর অর্থ এই নয় যে isআপনি যখন পূর্ণসংখ্যার মান সমতার জন্য পরীক্ষা করতে চান তখন ব্যবহার করা উচিত ।
মার্টিজন পিটারস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.