Saya membuat parser Python, dan ini benar - benar membingungkan saya:
>>> 1 in [] in 'a'
False
>>> (1 in []) in 'a'
TypeError: 'in <string>' requires string as left operand, not bool
>>> 1 in ([] in 'a')
TypeError: 'in <string>' requires string as left operand, not list
Bagaimana tepatnya "dalam" bekerja dengan Python, terkait dengan asosiatif, dll.?
Mengapa tidak ada dua dari ekspresi ini yang berperilaku sama?
python
syntax
python-2.x
pengguna541686
sumber
sumber
if a < b < c:
dan membuatnya bekerja secara intuitifin
sebagai operator "pembanding". : \Jawaban:
1 in [] in 'a'
dievaluasi sebagai(1 in []) and ([] in 'a')
.Karena kondisi pertama (
1 in []
) adalahFalse
, seluruh ketentuan dievaluasi sebagaiFalse
;([] in 'a')
tidak pernah benar-benar dievaluasi, jadi tidak ada kesalahan yang muncul.Berikut adalah definisi pernyataannya:
sumber
[]
salah, tetapi[]
bukanFalse
misalnya,[] and anything
kembali[]
(tidakFalse
).Python melakukan hal-hal khusus dengan perbandingan berantai.
Berikut ini dievaluasi secara berbeda:
Namun dalam kedua kasus tersebut, jika perbandingan pertama adalah
False
, pernyataan lainnya tidak akan dilihat.Untuk kasus khusus Anda,
Juga untuk mendemonstrasikan aturan pertama di atas, ini adalah pernyataan yang dievaluasi ke True.
Urutan operator python: http://docs.python.org/reference/expressions.html#summary
sumber
Dari dokumentasi:
Artinya, tidak ada asosiasi di dalam
x in y in z
!Berikut ini adalah padanannya:
sumber
Jawaban singkatnya, karena yang lama sudah diberikan beberapa kali di sini dan dengan cara yang sangat baik, adalah ekspresi boolean dihubung pendek , ini telah menghentikan evaluasi ketika perubahan benar menjadi salah atau sebaliknya tidak dapat terjadi dengan evaluasi lebih lanjut.
(lihat http://en.wikipedia.org/wiki/Short-circuit_evaluation )
Ini mungkin sedikit pendek (tidak ada permainan kata-kata) sebagai jawaban, tetapi seperti yang disebutkan, semua penjelasan lainnya sudah dilakukan dengan cukup baik di sini, tetapi saya pikir istilah itu pantas untuk disebutkan.
sumber