【问题标题】:Python operator precedence with augmented assignment including sequence [duplicate]Python运算符优先级与包括序列的增强赋值[重复]
【发布时间】:2019-03-01 12:13:22
【问题描述】:

跟进my previous question我有以下一个。这些在 Python 中是一样的吗?

a += b[1] / 2

a += (b[1] / 2)

前提是:

  • a 之前已经定义为 float
  • b 是一个元组列表
  • b[1] 是具有单个元素的元组

同样,我也有兴趣了解以下行为:

  • a 之前已经定义为 float
  • b 是浮点数列表

【问题讨论】:

  • 类型与解析的优先级无关。
  • 我认为您要问的是“由于a += expr 或多或少等同于a = a + expr,我是否需要担心加法的优先级与另一个的优先级相比表达式中的运算符?”我认为您上一个问题的现有答案涵盖了:添加和分配总是最后发生。
  • 是的,它们还是一样的。不管你想出什么样的表达式变体,+= 扩展赋值仍然只是一个声明。
  • 最好将a += expr 视为a = a + expr暗示性;扩充赋值运算符的实际语义独立于相应的二元运算符。 (也就是说,a += b 没有 表示像 a = a + b 这样的任何东西,但它并不尽可能接近它,这将是非常令人惊讶的。)
  • 如果b[1] 真的是tuple,则表达式将引发异常,因为元组上没有除法运算。

标签: python tensorflow operator-precedence augmented-assignment


【解决方案1】:

Python 解析表达式的规则在Python grammar 中定义。请注意,类型是不相关的。事实上,Python 是动态 类型,这意味着在解析和分析表达式时,变量的类型是未知。事实上,一个变量在整个过程中具有不同的值(具有不同的类型),并且一行可以被多次评估,每次变量都携带不同类型的值。

如果我们看一下语法,我们会看到:

expr: xor_expr ('|' xor_expr)*
xor_expr: and_expr ('^' and_expr)*
and_expr: shift_expr ('&' shift_expr)*
shift_expr: arith_expr (('<<'|'>>') arith_expr)*
arith_expr: term (('+'|'-') term)*
term: factor (('*'|'@'|'/'|'%'|'//') factor)*
factor: ('+'|'-'|'~') factor | power
power: atom_expr ['**' factor]
atom_expr: ['await'] atom trailer*
atom: ('(' [yield_expr|testlist_comp] ')' |
       '[' [testlist_comp] ']' |
       '{' [dictorsetmaker] '}' |
       NAME | NUMBER | STRING+ | '...' | 'None' | 'True' | 'False')
testlist_comp: (test|star_expr) ( comp_for | (',' (test|star_expr))* [','] )
trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME

订阅”(b[1] 中的[1] 因此在trailer生产规则 中定义,如果我们查看语法,这只能是factor 的乘积,因此这意味着/ 运算符优先于订阅。

也就是说:

a += b[1] / 2

相当于:

a += ((b[1]) / 2)

请注意,由于 Python 是动态类型的,因此解析(和分析)步骤不会保证表达式是有意义的。例如,一个元组不能被二除。所以这将导致TypeError

>>> (2.0, 4.0) / 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for /: 'tuple' and 'int'

但是,对于 numpy 数组,这是有道理的:

>>> from numpy import array
>>> array([2.0, 4.0])/2
array([1., 2.])

【讨论】:

    猜你喜欢
    • 2019-03-01
    • 1970-01-01
    • 2014-12-09
    • 2018-09-28
    • 2013-03-27
    • 2015-08-24
    • 2020-03-22
    • 2015-11-14
    • 1970-01-01
    相关资源
    最近更新 更多