هل خطأ == 0 و true == 1 في بيثون تفاصيل التنفيذ أم أنها مضمونة باللغة؟

StackOverflow https://stackoverflow.com/questions/2764017

سؤال

هل مضمون ذلك False == 0 و True == 1, ، في بيثون (على افتراض أنه لم يتم إعادة تعيينه من قبل المستخدم)؟ على سبيل المثال ، هل يضمن بأي حال من الأحوال أن الكود التالي سوف ينتج عنه دائمًا نفس النتائج ، مهما كانت إصدار Python (سواء الحاليين أو المحتمل ، المستقبلي)؟

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

أي إشارة إلى الوثائق الرسمية سيكون موضع تقدير كبير!

يحرر: كما لوحظ في العديد من الإجابات ، bool يرث من int. وبالتالي ، يمكن إعادة صياغة السؤال على النحو التالي: "هل تقول الوثائق رسميًا أن المبرمجين يمكنهم الاعتماد على المواليد الموروثة من الأعداد الصحيحة ، مع القيم 0 و 1؟ ". هذا السؤال مناسب لكتابة رمز قوي لن يفشل بسبب تفاصيل التنفيذ!

هل كانت مفيدة؟

المحلول

في Python 2.x هذا هو ليس مضمون كما هو ممكن True و False لإعادة تعيينه. ومع ذلك ، حتى لو حدث هذا ، لا يزال يتم إرجاع خطأ منطقي صحيح وخطأ منطقي للمقارنات.

في بيثون 3.x True و False هي الكلمات الرئيسية وستكون دائمًا مساوية ل 1 و 0.

في ظل الظروف العادية في بيثون 2 ، ودائما في بيثون 3:

False الكائن من النوع bool وهي فئة فرعية من int:

object
   |
 int
   |
 bool

هذا هو السبب الوحيد وراء مثالك ، ['zero', 'one'][False] تعمل. لن يعمل مع كائن ليس فئة فرعية من عدد صحيح ، لأن فهرسة القائمة تعمل فقط مع الأعداد الصحيحة ، أو الكائنات التي تحدد أ __index__ الطريقة (شكرا مارك ديكنسون).

يحرر:

هذا صحيح في إصدار Python الحالي ، ومن بين Python 3. مستندات Python 2.6 و ال مستندات Python 3 كلاهما يقول:

هناك نوعان من الأعداد الصحيحة: [...] أعداد صحيحة (int) [...] المنطقية (Bool)

وفي القسم الفرعي المنطقي:

BOOLEENS: هذه تمثل قيم الحقيقة كاذبة وصحيحة [...] تتصرف القيم المنطقية مثل القيم 0 و 1 ، على التوالي ، في جميع السياقات تقريبًا ، يكون الاستثناء هو أنه عند تحويله إلى سلسلة ، فإن الأوتار "خاطئة" "يتم إرجاعها ، على التوالي.

يوجد ايضا، لبيثون 2:

في السياقات الرقمية (على سبيل المثال عند استخدامها كوسيطة لمشغل الحساب) ، يتصرفون [خطأ وصحيح] مثل الأعداد الصحيحة 0 و 1 ، على التوالي.

لذلك يعتبر المنطقيون صراحة كمناسبات في بيثون 2.6 و 3.

إذن أنت آمن حتى يأتي Python 4. ؛-)

نصائح أخرى

رابط إلى PEP يناقش نوع Bool الجديد في Python 2.3: http://www.python.org/dev/peps/pep-0285/.

عند تحويل منطقة إلى int ، تكون قيمة عدد صحيح دائمًا 0 أو 1 ، ولكن عند تحويل int إلى منطقي ، تكون القيمة المنطقية صحيحة لجميع الأعداد الصحيحة باستثناء 0.

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

في Python 2.x ، ليس مضمونًا على الإطلاق:

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

لذلك يمكن أن يتغير. في Python 3.x ، صحيح ، خطأ ، ولا شيء الكلمات المحجوزة, ، وبالتالي فإن الكود أعلاه لن يعمل.

بشكل عام ، مع المنطقية ، يجب أن تفترض أنه على الرغم من أن False سيكون لها دائمًا قيمة عدد صحيح قدرها 0 (طالما أنك لم تقم بتغييرها ، على النحو الوارد أعلاه) ، يمكن أن يكون لـ True أي قيمة أخرى. لن أعتمد بالضرورة على أي ضمان True==1, ، ولكن على Python 3.x ، سيكون هذا هو الحال دائمًا ، بغض النظر عن ماذا.

بسيط جدا. نظرًا لأن Bool يتعلق بتقييم عدد صحيح كطرف ، فإن الصفر فقط يعطي إجابة خاطئة. ستعود جميع القيم غير الصفرية ، العوامات ، الأعداد الصحيحة ، بما في ذلك الأرقام السلبية ، أو ما لديك ، بشكل صحيح.

مثال رائع على سبب هذا المفيد هو تحديد حالة الطاقة للجهاز. على أي قيمة غير صفرية ، OFF هو الصفر. من الناحية الإلكترونية هذا أمر منطقي.

لتحديد صواب أو خطأ نسبيًا بين القيم ، يجب أن يكون لديك شيء لمقارنته به. هذا ينطبق على الأوتار وقيم الأرقام ، باستخدام == أو != أو <, > >=, <=, ، إلخ.

يمكنك تعيين عدد صحيح لمتغير ثم الحصول على صواب أو خطأ بناءً على تلك القيمة المتغيرة.

اكتب فقط int(False) وسوف تحصل 0, ، إذا كتبت int(True) سوف يخرج 1

خطأ هو منطقي. لديها نوع مختلف. إنه كائن مختلف من 0 وهو عدد صحيح.

0 == False يعود صحيح لأن خطأ يتم إلقاؤه إلى عدد صحيح. int (false) إرجاع 0

يقول وثائق Python للمشغل == (مساعدة ('==')):

المشغلين <, >, ==, >=, <=, ، و != قارن قيم كائنين. الكائنات لا تحتاج إلى نفس النوع. إذا كان كلاهما أرقامًا ، يتم تحويلهما إلى نوع مشترك.

نتيجة لذلك ، يتم تحويل خطأ إلى عدد صحيح عن الحاجة إلى المقارنة. لكنه يختلف عن 0.

>>> 0 is False
False
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top