2013-09-25 3 views
1

Как интерпретировать это предложение в Python (с точки зрения приоритета операторов)?Приоритет операторов Python

c = not a == 7 and b == 7 

в c = not (a == 7 and b == 7) или c = (not a) == 7 and b == 7?

благодаря

+2

http://docs.python.org/2/reference/expressions.html#operator-precedence – George

ответ

5

Использование dis модуля:

>>> import dis 
>>> def func(): 
...  c = not a == 7 and b == 7 
...  
>>> dis.dis(func) 
    2   0 LOAD_GLOBAL    0 (a) 
       3 LOAD_CONST    1 (7) 
       6 COMPARE_OP    2 (==) 
       9 UNARY_NOT   
      10 JUMP_IF_FALSE_OR_POP 22 
      13 LOAD_GLOBAL    1 (b) 
      16 LOAD_CONST    1 (7) 
      19 COMPARE_OP    2 (==) 
     >> 22 STORE_FAST    0 (c) 
      25 LOAD_CONST    0 (None) 
      28 RETURN_VALUE 

Таким образом, это выглядит следующим образом:

c = (not(a == 7)) and (b == 7) 
2

Согласно documentation заказа, от низшего приоритета (минимум связывания) до самого высокого приоритет (наиболее обязательный):

  1. and
  2. not
  3. ==

Таким образом, выражение not a == 7 and b == 7 будет оцениваться следующим образом:

((not (a == 7)) and (b == 7)) 
^ ^ ^ ^
second first third first 

Другими словами, дерево оценки будет выглядеть следующим образом:

 and 
    / \ 
    not == 
    | /\ 
    == b 7 
/\ 
    a 7 

И последнее, что было сделано, будет присвоить значение выражения c.

+1

Ссылка, которую вы указываете, указывает, что список упорядочен с наименьшим приоритетом до наивысшего приоритета, поэтому это будет '(not (a == 7)) и (b == 7) '. Если он был наивысшим до самого низкого, то, как вы говорите, это будет '((не a) == (7 и b)) == 7', так как' и 'будет иметь более высокий приоритет, чем' == '. –

+0

@ EricFinn yup, моя ошибка - исправлена! –

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