2016-03-29 19 views
3

Im folgenden Codefragment Funktion f wird wie erwartet ausgeführt:Python - Kurzschließen seltsame Verhalten

def f(): 
    print('hi') 
f() and False 
#Output: 'hi' 

Aber im folgenden ähnlichen Code-Fragment a nicht erhöht nicht:

a=0 
a+=1 and False 
a 
#Output: 0 

Aber wenn wir Kurzschluß mit Wahr anstelle von Falsch a wird inkrementiert:

a=0 
a+=1 and True 
a 
#Output: 1 

Wie funktioniert der Kurzschluss, damit dies funktioniert?

Antwort

8

Das ist, weil f() and False ein Ausdruck (technisch eine einzelsträngige Ausdrucksanweisung), während a += 1 and False ist eine Zuweisungsanweisung. Es löst sich tatsächlich zu a += (1 and False), und da 1 and False gleich False ist und False ist eigentlich die ganze Zahl 0, was passiert ist a += 0, ein No-Op.

(1 and True) jedoch ausgewertet True (was die ganze Zahl 1 ist), so bedeutet a += 1 and Truea += 1.

(auch beachten Sie, dass Python and und or immer die ersten ihre Operanden zurück, die eindeutig das Ergebnis der Betrie bestimmen kann)

+1

Es könnte sich lohnen zu klären "' (1 und True) 'ergibt" True ", die die ganze Zahl 1 ist." –

+0

In der Tat. Guter Fang. –

+0

Sollen 'a + = 1 und False' nicht in' a = (a + 1) und False' aufgelöst werden, da der '+' Operator eine höhere Priorität hat (https://docs.python.org/3/reference/ expressions.html # operator-precedence), dann wird der gesamte Ausdruck in "a = False" aufgelöst? – Hidden

0

Ich glaube, dass

a+=1 and False 

äquivalent zu

a+=(1 and False) 

und

a+=1 and True 

entspricht

a+=(1 and True) 

Zum Beispiel:

In [15]: a = 0 

In [16]: a+=2 and True 

In [17]: a 
Out[17]: 1 
+0

Ja, das ist es. In Python Zuweisung gibt keinen Wert wie in C. – beezz