2016-03-29 6 views
3

В функции фрагмента следующий код f запускается на выполнение, как и ожидалось:Python - закороток странное поведение

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

Но в следующем фрагменте кода подобного a не увеличивается:

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

Но если мы короткое замыкание с использованием True вместо False a приращается:

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

Как работает короткозамкнутый контур для этого?

ответ

8

Это потому, что f() and False является выражением (технически одно выражение-утверждение), тогда как a += 1 and False это оператор присваивания. Он фактически разрешается до a += (1 and False), а так как 1 and False равно False и False - это фактически целое число 0, что происходит a += 0, no-op.

(1 and True), однако, имеет значение True (который представляет собой целое число 1), так что a += 1 and True означает a += 1.

(также отметить, что and Python и or всегда возвращают первый из операндов, которые могут однозначно определить результат)

РАБОТА
+1

Возможно, стоит уточнить, что '' (1 и True) 'оценивается как' True', который является целым числом 1. " –

+0

Действительно. Хороший улов. –

+0

Не должно 'a + = 1 и False' разрешать' a = (a + 1) и False', поскольку оператор '+' имеет [более высокий приоритет] (https://docs.python.org/3/reference/ expression.html # operator-priorityence), тогда все выражение разрешено «a = False»? – Hidden

0

Я считаю, что

a+=1 and False 

эквивалентно

a+=(1 and False) 

и

a+=1 and True 

эквивалентно

a+=(1 and True) 

Например:

In [15]: a = 0 

In [16]: a+=2 and True 

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

Да, это так. В присваивании python не возвращается значение, как в C. – beezz