接下来my previous question,我有以下内容。这些在Python中是否相同?
a += b[1] / 2
和
a += (b[1] / 2)
提供以下信息:
a
之前已被定义为float b
是元组列表b[1]
是具有单个元素的元组类似地,如果满足以下条件,我也将有兴趣学习其行为:
a
之前已被定义为float b
是浮点数的列表答案 0 :(得分:3)
Python grammar中定义了Python如何解析表达式的规则。请注意, 类型不相关。实际上,Python是动态类型的,因此这意味着在解析和分析表达式时,变量的类型是 unknown 。实际上,变量在整个过程中具有不同的值(具有不同的类型),并且可以对一条线进行多次评估,并且每次变量都带有不同类型的值。
如果我们看一下语法,就会看到:
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]
中的b[1]
在trailer
的生产规则中定义,如果我们看一下语法,它只能是factor
的乘积,这意味着/
运算符的优先级高于订阅。
这意味着:
a += b[1] / 2
等效于:
a += ((b[1]) / 2)
请注意,由于Python是动态类型的,所以解析(和分析)步骤将不能保证表达式是 sensical 。例如,一个元组不能被两个分开。因此,这将导致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.])