Neden [[1,0] == True] değeri Yanlış olarak değerlendirilir?


153

Cevaplara bakarken Bu sorunun kendi cevabımı anlamadığımı fark ettim.

Bunun nasıl ayrıştırıldığını gerçekten anlamıyorum. İkinci örnek neden False döndürüyor?

>>> 1 in [1,0]             # This is expected
True
>>> 1 in [1,0] == True     # This is strange
False
>>> (1 in [1,0]) == True   # This is what I wanted it to be
True
>>> 1 in ([1,0] == True)   # But it's not just a precedence issue!
                           # It did not raise an exception on the second example.

Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    1 in ([1,0] == True)
TypeError: argument of type 'bool' is not iterable

Herhangi bir yardım için teşekkürler. Sanırım gerçekten bariz bir şeyi kaçırmam gerekiyor.


Bu bağlantılı yinelenenden farklı olduğunu düşünüyorum:

0 <0 == 0 ifadesi Python'da neden False döndürüyor?.

Her iki soru da insanın ifadeyi kavramasıyla ilgilidir. İfadeyi değerlendirmenin (aklıma göre) iki yolu var gibi görünüyordu. Tabii ki ikisi de doğru değildi, ama benim örneğimde, son yorum imkansız.

0 < 0 == 0Sana bakmak her yarının değerlendirildiğini ve bir ifade olarak anlamlı olduğunu hayal edebiliyordu:

>>> (0 < 0) == 0
True
>>> 0 < (0 == 0)
True

Bağlantı, bunun neden değerlendirildiğini cevaplıyor False:

>>> 0 < 0 == 0
False

Ancak benim örneğim 1 in ([1,0] == True)bir ifade olarak anlam ifade etmiyor, bu yüzden iki (kuşkusuz yanlış) olası yorum yerine, sadece biri mümkün görünüyor:

>>> (1 in [1,0]) == True

1
Operatör önceliği ... ==bağlar daha sıkıdır in, bu yüzden [1,0] == Trueönce değerlendirilir, daha sonra bunun sonucu beslenir 1 in other_result.
Marc B

Python 3.2 aynı şekilde davrandığından Python-2.7 etiketini kaldırdım.
lvc

1
@Marc B: İkinci ifadeyi açıklamıyor
Scott Hunter

32
@MarcB, soru bu yorumu çürütmek için parantez kullanarak bir test içeriyordu.
Mark Ransom

Yanıtlar:


194

Python aslında burada zincirleme karşılaştırma operatörü uygular. İfade şu dile çevrildi:

(1 in [1, 0]) and ([1, 0] == True)

açıkçası False.

Bu, aşağıdaki gibi ifadeler için de geçerlidir

a < b < c

bunun anlamı

(a < b) and (b < c)

(değerlendirmeden b iki kez ).

Daha fazla ayrıntı için Python dil belgelerine bakın.


40
Bunun için ek kanıt, 1 in [1, 0] == [1, 0]değerlendirir True.
Andrew Clark

9
Bunu uzun zamandır bir dil siğili olarak düşündüm. inOperatörün diğer karşılaştırma operatörlerinden daha yüksek bir önceliğe sahip olmasını ve zincirlememesini tercih ederdim . Ama belki de bir kullanım vakasını kaçırıyorum.
Steven Rumbalski

3
güzel yakaladım, bunu düşünmedim bile. Zincirleme izin vermek pek mantıklı değil in- sonuçta x < y < zmantıklı, ama çok fazla değilx in y in z
BlueRaja - Danny Pflughoeft

7
@ Yararlı: belki. Okunabilir: kesinlikle değil. Python, bu sözleşmeyle ortak matematiksel tipografiyi taklit ettiğini iddia ediyor, ancak bununla birlikte kullanıldığında inartık durum böyle değil ve oldukça sezgisel hale getiriyor.
Konrad Rudolph

6
@KonradRudolph: Matematiksel metinlerde bir kereden fazla "1 ≤ x ∈ ℝ" gibi düşünceler gördüm, ama temel olarak sana katılıyorum.
Sven Marnach
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.