2016-11-05 2 views
2

В Python я нашел действительно странное поведение. Один из моих студентов сделали какую-то ошибку, пытаясь найти элементы, которые принадлежат к двум спискам, он писал:и оператор в списках Python

list1 and list2 

странное поведение не в том, что никакой ошибки обжигают на Python 3! list1 and list2 действительно имеет значение list2.

Есть ли известная причина для этого?

ответ

4

and просто оценивает истинность двух предоставленных значений. Если первый - True (см. bool(list1)), второй оценивается и возвращается. Если первым аргументом является False (например, [] and list2), его значение немедленно возвращается.

В documentation on Boolean Operations обоснование такого поведения ясно говорится:

Обрати внимание, что ни and, ни or ограничивают значение и тип они возвращаются к False и True, а вернуть последний оцененный аргумент. Иногда это полезно, например, если s - это строка, которая должна быть заменена значением по умолчанию, если оно пустое, выражение s or 'foo' дает требуемое значение.

(выделено мной)

Обратите внимание, что такое поведение не найден с not, которые, вместо этого, возвращает значение True/False, основанный на аргументе условии.

+0

Спасибо большое. Именно этого я и не понял. –

+1

Добро пожаловать @ Куломбо. Всегда заглядывайте в Python Docs для поведения вроде этого, он обычно скрывается где-то там :-) –

1

Ну, если они оба имеют значения, тогда «если list1 и list2:» должны возвращать значение True, и оно будет продолжаться до следующей строки в коде. Python3 считает Правда, если переменная не отличается, то None или 0. Пример:

a = 1 
if a: #This will be True since a is different then None or 0 
    print("Works") 
>>> Works 

b = 0 
if b: 
    print("Works") 
>>> 
This one returned nothing because b is 0 wich means that the "if b" will return False. 

Кроме того, он будет возвращать Правда в списках, если список содержит по крайней мере один элемент в ней.

1

Когда вы спрашиваете list1 and list2, питон звонит __bool__ по телефону list1 и list2. Поскольку [] оценивает по False, а непустой список оценивается в True, and смотрит на list1 и list2 в свою очередь, пока не найдет пустой список (или он смотрит на все списки, если пустой список не найден).

Наконец, выражение and оценивает либо этот пустой список, что приводит к ошибке and, либо последнему списку в сравнении. Вот почему вы возвращаете list2 в качестве значения.

Интересно, что вы можете использовать это поведение в ваших интересах, чтобы установить значения по умолчанию:

def func(arg=None): 
    arg = arg or [5] # now, [5] is the default value of arg 

Это практически то же самое, как делают:

def func(arg=None): 
    if arg is None: 
     arg = [5] 

 Смежные вопросы

  • Нет связанных вопросов^_^