-2

我上一个问题之后,我有以下问题。这些在 Python 中是否相同?

a += b[1] / 2

a += (b[1] / 2)

提供了:

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

同样,如果出现以下情况,我也会有兴趣了解行为:

  • a之前已经定义为 float
  • b是一个浮动列表
4

1 回答 1

3

Python 解析表达式的规则在Python 语法中定义。请注意,类型是不相关的。实际上 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

订阅”([1]inb[1]因此定义在 的生产规则trailer,如果我们查看语法,这只能是 a 的乘积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.])
于 2018-09-25T19:39:11.860 回答