“X bukan di y” atau “bukan x di y”


97

Saat menguji keanggotaan, kami dapat menggunakan:

x not in y

Atau sebagai alternatif:

not x in y

Ada banyak kemungkinan konteks untuk ekspresi ini bergantung pada xdan y. Ini bisa untuk pemeriksaan substring, daftar keanggotaan, keberadaan kunci dict, misalnya.

  • Apakah kedua bentuk itu selalu sama?
  • Apakah ada sintaks yang disukai?

Jawaban:


112

Mereka selalu memberikan hasil yang sama.

Faktanya, not 'ham' in 'spam and eggs'tampaknya kasus khusus untuk melakukan operasi "tidak dalam" tunggal, bukan operasi "dalam" dan kemudian meniadakan hasil:

>>> import dis

>>> def notin():
    'ham' not in 'spam and eggs'
>>> dis.dis(notin)
  2           0 LOAD_CONST               1 ('ham')
              3 LOAD_CONST               2 ('spam and eggs')
              6 COMPARE_OP               7 (not in)
              9 POP_TOP             
             10 LOAD_CONST               0 (None)
             13 RETURN_VALUE    

>>> def not_in():
    not 'ham' in 'spam and eggs'
>>> dis.dis(not_in)
  2           0 LOAD_CONST               1 ('ham')
              3 LOAD_CONST               2 ('spam and eggs')
              6 COMPARE_OP               7 (not in)
              9 POP_TOP             
             10 LOAD_CONST               0 (None)
             13 RETURN_VALUE    

>>> def not__in():
    not ('ham' in 'spam and eggs')
>>> dis.dis(not__in)
  2           0 LOAD_CONST               1 ('ham')
              3 LOAD_CONST               2 ('spam and eggs')
              6 COMPARE_OP               7 (not in)
              9 POP_TOP             
             10 LOAD_CONST               0 (None)
             13 RETURN_VALUE        

>>> def noteq():
    not 'ham' == 'spam and eggs'
>>> dis.dis(noteq)
  2           0 LOAD_CONST               1 ('ham')
              3 LOAD_CONST               2 ('spam and eggs')
              6 COMPARE_OP               2 (==)
              9 UNARY_NOT           
             10 POP_TOP             
             11 LOAD_CONST               0 (None)
             14 RETURN_VALUE      

Awalnya saya berpikir bahwa mereka selalu memberikan hasil yang sama, tetapi itu notsendiri hanyalah operator negasi logis prioritas rendah, yang dapat diterapkan a in bsemudah ekspresi boolean lainnya, sedangkan not inmerupakan operator terpisah untuk kenyamanan dan kejelasan. .

Pembongkaran di atas mengungkapkan! Tampaknya meskipun notjelas merupakan operator negasi logis, formulirnya not a in bdikurung khusus sehingga tidak benar-benar menggunakan operator umum. Ini not a in bsecara harfiah membuat ekspresi yang sama a not in b, bukan hanya ekspresi yang menghasilkan nilai yang sama.


4
Perlu diingat bahwa ini hanya detail implementasi. Saya bahkan tidak dapat menemukan menyebutkannya not x in xsdi dokumen.
phant0m

1
@ phant Benar-benar; cara yang seharusnya Anda pikirkan not x in xsadalah not (x in xs). Tetapi fakta bahwa itu diimplementasikan dengan menguraikannya menjadi bytecode yang persis sama seperti yang dengan x not in xssangat jelas menunjukkan bahwa mereka harus selalu identik, sebagai lawan dari hal-hal seperti not x == yvs x != yyang seharusnya memberikan hasil yang sama, tetapi tidak harus (tergantung pada implementasi dari __eq__dan __ne__terlibat).
Ben

11
Anda telah mengalami optimasi lubang intip CPython ; pengoptimalan waktu kompilasi yang dapat diabaikan atau disalin oleh implementasi Python lain seperti Jython dan IronPython (ini bukan bagian dari spesifikasi bahasa).
Martijn Pieters

15

  1. Tidak, tidak ada perbedaan.

    Operator not indidefinisikan memiliki nilai benar terbalik in.

    - Dokumentasi Python

  2. Saya akan berasumsi not inlebih disukai karena lebih jelas dan mereka menambahkan kasus khusus untuk itu.



3

Yang lain telah memperjelas bahwa kedua pernyataan itu, turun ke tingkat yang sangat rendah, setara.

Namun, saya tidak berpikir ada orang yang cukup stres sehingga karena ini menyerahkan pilihan kepada Anda, Anda harus melakukannya

pilih formulir yang membuat kode Anda dapat dibaca semaksimal mungkin.

Dan belum tentu dapat dibaca oleh siapa pun , meskipun itu tentu saja merupakan tujuan yang bagus. Tidak, pastikan kode tersebut adalah sebagai dibaca mungkin untuk Anda , karena Anda adalah orang yang paling mungkin untuk kembali ke kode ini kemudian dan mencoba untuk membacanya.


Jika Anda bekerja dalam tim besar atau pada kode yang mungkin tidak tersentuh untuk sementara waktu, kemungkinan besar orang lain harus mempertahankannya.
Tommy Herbert


1

Secara sintaksis mereka adalah pernyataan yang sama. Saya akan dengan cepat menyatakan bahwa 'ham' not in 'spam and eggs'menyampaikan maksud yang lebih jelas, tetapi saya telah melihat kode dan skenario yang not 'ham' in 'spam and eggs'menyampaikan arti yang lebih jelas daripada yang lain.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.