2012-04-20 4 views
2

У меня есть некоторый код здесь:Python None и если условия

m = None 
n = None 

if not m: 
    print "Something happens" 
>>> Something happens 

если я:

if not m and n: 
    print "Something happens" 

Ничего не происходит.

Но я могу сделать:

m, n = 1,2 
if m and n: 
    print "Something happens" 
>>> Something happens 

Почему если и если не обрабатываются таким же образом? Делает ли «если нет», не принимает «и» заявления?

Спасибо

+0

я видел где-то, что это хорошая практика сравните с None, используя личность. например: 'if m is None и n не None:'. – Fenikso

ответ

11

У вас есть operator precedence проблемы.

if not m and n эквивалентен if (not m) and n. То, что вы хотите, это if not m and not n или if not (m or n).

Смотрите также: De Morgan's Laws

+0

Спасибо, очень просто – Neeran

+1

Если у вас есть сомнения, в скобках. Иногда я задаюсь вопросом, сколько времени будет сохранено, если языки требуют, чтобы вы использовали явную группировку в любом состоянии, где может возникнуть вопрос. Вы потратили бы несколько секунд, набрав extra(), но вы бы сэкономили намного больше в первый раз, когда избежали путающих вещей, подобных этому. Тогда вы будете тратить впустую в два раза больше времени, сидя вокруг водяного охладителя, сутулящего все() на этом глупом языке ... –

+0

@BillK Вы в основном описываете, как это работает в lisp. –

2

not применяется к его шкафу операнда. Вы написали if not m and n, где not относится к m, который является True, и из-за and, n оценивается до False, поэтому весь оператор оценивается в False.

1

Я думаю, что вы ищете эту статью: Truth Value Testing

Любой объект может быть проверены на значение истинности, для использования в случае или при условии или как операнд булевых операций ниже. Следующие значения не считаются ложными:

  • Ни
  • Ложные
  • ноль любого числового типа, например, 0, 0L, 0.0, 0j.
  • любая пустая последовательность, например, '', (), [].
  • любое пустое картографирование, например, {}.
  • экземпляров пользовательских классов, если класс определяет метод __nonzero__() или __len__(), когда этот метод возвращает целое число 0 или значение bool False.

Все остальные значения считаются истинными, поэтому объекты многих типов всегда верны. Операции и встроенные функции, которые имеют логический результат, всегда возвращают 0 или False для false и 1 или True для правдивых, если не указано иное. (Важное исключение: логические операции и/или и всегда возвращают один из их операндов.)

Особенно в следующей главе объясняет свой случай (Boolean Operations — and, or, not):

не имеет более низкий приоритет, чем не-булевых операторов

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