2016-06-21 2 views
0

В учебниках Python3 указано, что «Можно присвоить результат сравнения или другое булево выражение для переменной». Приведенный пример:Python: Сравнить строки с оператором 'or'

>>> string1, string2, string3 = '', 'Trondheim', 'Hammer Dance' 
>>> non_null = string1 or string2 or string3 
>>> non_null 
'Trondheim' 

Что именно делает оператор «или» при сравнении строк? Почему выбирается «Тронхейм»?

+0

В принципе, если string1 == True then non_null = string1 else if string2 == True then non_null = string2 else if string3 == True then non_null = string3 Он останавливается в строке2, потому что любая непустая строка является истиной в Python. – bi0phaz3

+0

@ bi0phaz3: "string" == True false. Вы имеете в виду bool (string1) == True. – RemcoGerlich

+0

Python может использовать неявно для этого, я думаю – bi0phaz3

ответ

1

Когда рассматривается как логическое значение, пустая строка будет возвращать False и не пустая строка будет возвращать True.

Поскольку Python поддерживает короткое замыкание, в выражении a or b, b не будет оцениваться, если a имеет значение True.

В вашем примере у нас есть '' or 'Trondheim' or 'Hammer Dance'.

Это выражение оценивается слева направо, поэтому первое оценивается '' or 'Trondheim', или другими словами False or True, который возвращает True. Затем Python пытается оценить 'Trondheim' or 'Hammer Dance', который, в свою очередь, становится True or 'Hammer Dance'. Из-за короткого замыкания, упомянутого ранее, поскольку левый объект True, 'Hammer Dance' даже не оценивается до True, поэтому возвращается 'Trondheim'.

1

or возвращает значение слева от него, если оно истинно-иш, а другое справа.

Для строк только "" (пустая строка) не истинно-иш, а все остальные.

Так

>>> "" or "Test" 
"Test" 

и

>>> "One" or "Two" 
"One" 

Это не делает сравнение вообще.

+0

А, я вижу. Короткое замыкание? Теперь я чувствую себя немного глупо. – uncreative

+0

Да, это короткие замыкания. – RemcoGerlich

2

включено or выбирает первый не falsy строку (проверка слева направо), который в данном случае является 'Trondheim'

>>> bool('') 
False 
>>> bool('Trondheim') 
True 

Это иногда предпочтительнее при выполнении этого типа чека strip строковые литералы как пустое пространство также правдиво, если вы не хотите выбирать пробелы.

>>> bool(' ') 
True 
1

При назначении non_null, то or сравнения вычисляются последовательно, что приводит к следующему:

if string1: 
    non_null = string1 
elif string2: 
    non_null = string2 
elif string3: 
    non_null = string3 
else: 
    non_null = False 

Однако, в вашем примере, string1 пустая строка, которая оценивается как False (вы можете проверить это, набрав в подсказке if not '':print("Empty")).

С string2 не является пустым, поэтому оценивается как True, он присваивается non_null, следовательно, результат.