Jika saya melakukan ini:
>>> False in [False, True]
True
Itu kembali True
. Hanya karena False
ada dalam daftar.
Tetapi jika saya lakukan:
>>> not(True) in [False, True]
False
Itu kembali False
. Sedangkan not(True)
sama dengan False
:
>>> not(True)
False
Mengapa?
python
python-2.7
python-3.x
Texom512
sumber
sumber
not(True) in [False, True]
Jawaban:
Operator precedence 2.x , 3.x . Diutamakan
not
lebih rendah dariin
. Jadi itu setara dengan:Ini yang Anda inginkan:
Seperti yang ditunjukkan @Ben: Disarankan untuk tidak pernah menulis
not(True)
, lebih sukanot True
. Yang pertama membuatnya tampak seperti panggilan fungsi, sementaranot
adalah operator, bukan fungsi.sumber
not(True)
; lebih sukanot True
. Yang pertama membuatnya tampak seperti pemanggilan fungsi, dari sanalah kebingungan Anda berasal; jikanot
fungsi, makanot(True) in ...
tidak mungkinnot ((True) in ...)
. Anda harus tahu itu operator (atau Anda berakhir dalam situasi seperti ini), jadi Anda harus menulisnya seperti operator, bukan menyamarkannya sebagai fungsi.a + b*c + d
, sangat buruk untuk menulisa+b * c+d
. Jadinot(True)
buruk dengan ukuran itu juga.not True
. TulisFalse
saja.not True
, Anda akan menulis sesuatu seperti dinot myfunc(x,y,z)
manamyfunc
beberapa fungsi yang mengembalikanTrue
atauFalse
.not x in y
dievaluasi sebagaix not in y
Anda dapat melihat persis apa yang terjadi dengan membongkar kode. Kasing pertama berfungsi seperti yang Anda harapkan:
Kasus kedua, dievaluasi menjadi
True not in [False, True]
, yangFalse
jelas:Apa yang ingin Anda ungkapkan adalah
(not(True)) in [False, True]
, yang seperti yang diharapkanTrue
, dan Anda dapat melihat alasannya:sumber
dis
tetapi ini adalah jawaban yang sangat berharga karena itu menunjukkan bahwa sebenarnyanot in
digunakanDiutamakan operator.
in
mengikat lebih erat daripadanot
, jadi ekspresi Anda setara dengannot((True) in [False, True])
.sumber
Ini semua tentang prioritas operator (
in
lebih kuat darinot
). Tapi itu dapat dengan mudah diperbaiki dengan menambahkan tanda kurung di tempat yang tepat:penulisan:
sama seperti:
yang terlihat jika
True
ada dalam daftar dan mengembalikan "tidak" dari hasilnya.sumber
Ini mengevaluasi sebagai
not True in [False, True]
, yang mengembalikanFalse
karenaTrue
ada di[False, True]
Jika kamu mencoba
Anda mendapatkan hasil yang diharapkan.
sumber
Di samping jawaban lain yang menyebutkan prioritas
not
lebih rendah daripadain
, sebenarnya pernyataan Anda setara dengan:Tetapi perhatikan bahwa jika Anda tidak memisahkan kondisi Anda dari yang lain, python akan menggunakan 2 peran (
precedence
atauchaining
) untuk memisahkannya, dan dalam hal ini python menggunakan prioritas. Juga, perhatikan bahwa jika Anda ingin memisahkan suatu kondisi Anda harus meletakkan semua kondisi dalam tanda kurung bukan hanya objek atau nilai:Tapi seperti yang disebutkan, ada modifikasi lain oleh python pada operator yang chaining :
Berdasarkan dokumentasi python :
Misalnya hasil dari pernyataan berikut adalah
False
:Karena python akan mem-chain pernyataan seperti berikut:
Yang tepatnya
False and True
ituFalse
.Anda dapat mengasumsikan bahwa objek pusat akan dibagi antara 2 operasi dan objek lainnya (Salah dalam kasus ini).
Dan perhatikan bahwa ini juga berlaku untuk semua Perbandingan, termasuk tes keanggotaan dan operasi tes identitas yang mengikuti operan:
Contoh:
Contoh terkenal lainnya adalah rentang angka:
yang sama dengan:
sumber
Mari kita melihatnya sebagai operasi pengecekan penahanan koleksi:
[False, True]
adalah daftar yang berisi beberapa elemen.Ekspresi
True in [False, True]
kembaliTrue
, sepertiTrue
elemen yang terkandung dalam daftar.Oleh karena itu,
not True in [False, True]
berikan "boolean berlawanan",not
hasil dari ekspresi di atas (tanpa tanda kurung untuk mempertahankan prioritas, karenain
memiliki prioritas lebih besar daripadanot
operator). Karena itu,not True
akan dihasilkanFalse
.Di sisi lain,,
(not True) in [False, True]
sama denganFalse in [False, True]
, yaituTrue
(False
tercantum dalam daftar).sumber
Untuk mengklarifikasi beberapa jawaban lain, menambahkan tanda kurung setelah operator unary tidak mengubah prioritasnya.
not(True)
tidak membuatnot
ikatan lebih erat keTrue
. Itu hanya sekumpulan tanda kurung yang berlebihanTrue
. Sama seperti(True) in [True, False]
. Tanda kurung tidak melakukan apa pun. Jika Anda ingin pengikatan lebih kencang, Anda harus meletakkan tanda kurung di seluruh ekspresi, yang berarti operator dan operan, yaitu(not True) in [True, False]
,.Untuk melihat ini dengan cara lain, pertimbangkan
**
mengikat lebih erat daripada-
, itulah sebabnya Anda mendapatkan negatif dua kuadrat, bukan kuadrat dua negatif (yang akan positif empat).Bagaimana jika Anda ingin kuadrat dari dua negatif? Jelas, Anda akan menambahkan tanda kurung:
Namun, tidak masuk akal untuk mengharapkan yang berikut diberikan
4
karena
-(2)
sama dengan-2
. Tanda kurung sama sekali tidak melakukan apa pun.not(True)
persis sama.sumber