2011-05-23 6 views
31

Boole değerlerini == ile karşılaştırmak Python'da çalışır.Python'da 'True == Not False' sözdizimi hatası neden?

Python 2.7 (r27:82500, Sep 16 2010, 18:02:00) 
[GCC 4.5.1 20100907 (Red Hat 4.5.1-3)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> True == True 
True 
>>> False == False 
True 
>>> True is not False 
True 
>>> True == not False 
    File "<stdin>", line 1 
    True == not False 
      ^
SyntaxError: invalid syntax 
>>> 

Bu neden bir yazım hatasıdır: Ben boolean not operatörü uygulayacaktır Ama, sonuç bir yazım hatasıdır? Ben not False bir boolean değer döndüren bir ifade olmasını beklediğiniz ve True == <x><x> geçerli sözdizimi ile bir ifadesidir yerde geçerli sözdizimi olmak.

O ( == not daha yüksek bir önceliğe sahip olduğundan, tercüman değil True karşılaştırarak sanıyor) operator precedence in Python ile ilgisi var
+7

Not * değildir * "(Yanlış değil) True" ile aynıdır. "değil" ifadesi, "Doğru olan (Yanlış değil)" ifadesi "Yanlış olanın yanlış okunmasıyla aynıdır" ifadesini okur. Sadece bir açıklama, çünkü örneğiniz sanki sanki her ikisinin de aynı olduğunu varsayıyormuşsunuz gibi görünüyor. – lunaryorn

+0

'True == not', gerçek sözdizimi hatasıdır, bundan sonra hiçbir şey alakasızdır. – dansalmo

+2

Ve kayıt için, ** karşılaştırması ** ne ** ** herhangi bir ** karşılaştırma operatörü artı ** için başarısız olur. "Doğru "Yanlış" değil, "3.3> = 4.5 değil", {} [] değil, [set]() == None 've' slice()! = lambda değil: x' ** all ** aynı sözdizimi hatasını yükseltmez. Bu, '== not' ve booleans ile sınırlı değildir. –

cevap

45

. Eğer parantez olmadan bir karşılaştırma sağ tarafındaki not kullanamaz Genel olarak

True == (not False) 

: Sen işlemlerin sırasını netleştirmek için bazı parantez gerekir. Bununla birlikte, bir karşılaştırmanın sağ tarafında bir not kullanmanız gereken bir durumu düşünemiyorum.

+1

Operatör önceliğinin bir nedeni var mı, yoksa sadece bir "özellik" mi? –

+0

Vay; bu ilginç. Olumsuzluğun düşük önceliğe sahip olduğu, kesinlikle eşitlikten daha düşük olmadığını bildiğim başka bir dil düşünemiyorum! – verdesmarald

+0

@Jim: Tarihsel ve özellikle matematikten gelen programlama dillerinin operatör önceliği çoğunlukla keyfi. En azından ekleme ve çarpmanın ötesinde. – Joey

10

Bu operatör öncelik meselesi.

Dene:

>>> True == (not False) 
True 

this table of operator precedences bir göz, sen == not daha tigher bağlar olduğunu göreceksiniz ve bu nedenle True == not False açıkça bir hata olduğu (True == not) False olarak ayrıştırılır.

1

Sana seyir için "değil" ne düşünüyorum. Bu size baktığınız sonuçları verir. Karşılaştırma yapan boole'ları sahip olduğunuz şey bileşik bir boole ifadesiyse, burada bir örnek web sitesi Compound Boolean Expression. "Doğru Yanlış olmadığını"

>>> True and True 
True 
>>> True and not True 
False 
>>> True and not False 
True 
>>> False and not True 
False 
>>> False and not False 
False 
>>> False and False 
False