"X y'de değil" veya "y'de x değil"


97

Üyelik için test ederken şunları kullanabiliriz:

x not in y

Veya alternatif olarak:

not x in y

Bağlı bu ifadesi için pek olası içerik olabilir xve y. Örneğin, bir alt dize kontrolü, liste üyeliği, anahtar varlığını dikte için olabilir.

  • İki form her zaman eşdeğer midir?
  • Tercih edilen bir sözdizimi var mı?

Yanıtlar:


112

Hep aynı sonucu verirler.

Aslında, not 'ham' in 'spam and eggs'"içeride" bir işlem yerine tek bir "içinde değil" işlemi gerçekleştiren ve ardından sonucu olumsuzlayan özel bir durum gibi görünüyor:

>>> 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      

İlk başta hep aynı sonucu verdiklerini düşünmüştüm, ancak nottek başına düşük öncelikli mantıksal bir olumsuzlama operatörü olduğunu ve a in bdiğer herhangi bir boole ifadesine olduğu kadar kolayca uygulanabilecekken , not inkolaylık ve netlik için ayrı bir operatör olduğunu düşünmüştüm. .

Yukarıdaki demontaj açıklayıcıydı! Görünüşe göre notmantıksal bir olumsuzlama operatörü olsa da, form not a in baslında genel operatörü kullanmaması için özel kasaya alınmıştır. Bu, yalnızca aynı değerle sonuçlanan bir ifade yerine , not a in bkelimenin tam anlamıyla aynı ifadeyi yapar a not in b.


4
Bunun yalnızca bir uygulama detayı olduğunu unutmayın. not x in xsDokümanlarda sözünü bile bulamıyorum .
phant0m

1
@ phant0m Kesinlikle; yolu aklınıza zannediyorsunuz not x in xsDİR not (x in xs). Ama tam olarak aynı bayt koduna çözümlenerek uygulanacağı gerçeği x not in xsgibi şeyler aksine, her zaman aynı olması gerektiğini çok net gösterileri not x == yvs x != yhangi gerektiğini aynı sonucu verir ancak uygulamalarında bağlı (gerekmez __eq__ve __ne__dahil).
Ben

12
Bir CPython gözetleme deliği optimizasyonuna girdiniz ; Jython ve IronPython gibi diğer Python uygulamalarının göz ardı etmek veya kopyalamak için özgür olduğu bir derleme zamanı optimizasyonu (dil belirtiminin bir parçası değildir).
Martijn Pieters

16

  1. Hayır, fark yok.

    Operatörün not ingerçek değerinin tersine sahip olacak şekilde tanımlanmıştır in.

    - Python belgeleri

  2. not inDaha açık olduğu ve bunun için özel bir durum ekledikleri için tercih edildiğini varsayıyorum .



3

Diğerleri, iki ifadenin oldukça düşük bir seviyeye kadar eşdeğer olduğunu çok net bir şekilde ifade ettiler.

Ancak, henüz kimsenin yeterince vurguladığını sanmıyorum, bu seçimi size bıraktığı için,

Kodunuzu olabildiğince okunabilir kılan formu seçin.

Ve bu elbette amaçlanması güzel bir şey olsa bile , herkes tarafından mümkün olduğu kadar okunabilir değil . Hayır, kodun sizin için mümkün olduğunca okunabilir olduğundan emin olun , çünkü bu koda daha sonra geri dönüp okumaya en muhtemel olan sizsiniz.


1
Büyük bir ekipte veya bir süre dokunulmaması muhtemel bir kod üzerinde çalışıyorsanız, muhtemelen başka birinin onu sürdürmesi gerekebilir.
Tommy Herbert


1

Sözdizimsel olarak aynı ifadeler. Bunun daha 'ham' not in 'spam and eggs'net bir amaç taşıdığını hızlıca ifade edebilirim, ancak not 'ham' in 'spam and eggs'diğerinden daha net bir anlam taşıyan kod ve senaryolar gördüm .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.