هل خطأ == 0 و true == 1 في بيثون تفاصيل التنفيذ أم أنها مضمونة باللغة؟
-
02-10-2019 - |
سؤال
هل مضمون ذلك 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