“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?
wim
sumber

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.

Ben
sumber
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.

icktoofay
sumber
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.

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

Dengan Python, tidak ada perbedaan. Dan tidak ada preferensi.

Ignacio Vazquez-Abrams
sumber
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.

Makoto
sumber