2013-08-30 1 views
4

Мне действительно нужен xor для моего решения, но, думая об этом, я начал задаваться вопросом о том, что было выше. В чем смысл True == True != False?В чем смысл True == True! = False на Python и как узнать?

Глядя на документацию, я полагаю, что это True == True and True != False, но мне нужен более общий и определенный подход. Как быстро получить читаемую форму байт-кода для такого кода. Есть ли более простой способ узнать, чем байт-код и документацию?

ответ

9

Это называется operator chaining. Всякий раз, когда у вас есть выражение вроде A op1 B op2 C с op1 и op2 сравнение, это значит "переведено" на A op1 B and B op2 C. (Фактически он оценивает B только один раз).

Примечание: оператор сравнения: in, not in, is, is not! (например, a is b is not None означает a is b and b is not None).

Если вы хотите взглянуть на байткод вы можете использовать модуль dis:

In [1]: import dis 

In [2]: dis.dis(lambda: True == True != False) 
    1   0 LOAD_CONST    1 (True) 
       3 LOAD_CONST    1 (True) 
       6 DUP_TOP    
       7 ROT_THREE    
       8 COMPARE_OP    2 (==) 
      11 JUMP_IF_FALSE_OR_POP 21 
      14 LOAD_CONST    2 (False) 
      17 COMPARE_OP    3 (!=) 
      20 RETURN_VALUE   
     >> 21 ROT_TWO    
      22 POP_TOP    
      23 RETURN_VALUE 

Если вы читаете в байткод вы можете понять, что он выполняет оператор цепочки.

Учитывая, что выражение True == True != False, которое «интерпретируется», как True == True and True != False он сначала загружает дваTrue константы для первого оператора через LOAD_CONST байт-кода. DUP_TOP дублирует верхнюю часть стека (это позволяет избежать переоценки True для второго сравнения). Он выполняет первое сравнение (COMPARE_OP), если оно ложно только для байт-кода 21, в противном случае он выталкивает верхнюю часть стека (JUMP_IF_FALSE_OR_POP). Затем он выполняет второе сравнение.

Чтобы ответить на ваш общий вопрос, самый быстрый способ узнать о какой-либо функции python - использовать страницу документации quicksearch. Я также предлагаю прочитать Python's tutorial для общего ознакомления с языком.

Я хотел бы добавить, что, поскольку python предоставляет интерактивную среду, часто бывает легче понять, как работает какой-то код, записывая его в интерпретаторе и наблюдая за результатами.Почти все типы buil-in имеют документацию, доступную через docstrings, поэтому help(some_object) должен предоставить вам много информации. В частности, IPython предоставляет улучшенный интерактивный интерпретатор с более удобными справочными сообщениями/форматированием ошибок и т. Д.)

+0

Спасибо, это было очень исчерпывающим. Я на самом деле использую IPython и вспомогательные функции и посмотрел его в документах, но у меня не было опыта работы с 'dis' или quicksearch. Ответ от @nickie дает некоторое представление о том, почему я хотел знать о 'dis'. Мой код оценивается с одинаковым значением как в Python, так и в типичной семантике, поэтому мой обычный подход (интерпретатор) не сокращает его. – dhill

4

В большинстве языков a == b != c анализирует как (a == b) != c. Таким образом, вы ожидаете, что True == True != False будет таким же, как (True == True) != False, что составляет True != False, что соответствует True.

Python имеет другое значение, как можно наблюдать здесь:

>>> True != False != False 
False 
>>> (True != False) != False 
True 

В Python, a == b != c эквивалентно (a == b) and (b != c). Это означает, что True == True != False эквивалентно (True == True) and (True != False), что составляет True and True, что составляет True.

Кстати, оба значения (Python и другие языки) дают здесь один и тот же результат, но нужно быть осторожным.

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