2024-04-18 23:21:19 发布
网友
接下来my previous question我有一个。这些在Python中是相同的吗?你知道吗
a += b[1] / 2
以及
a += (b[1] / 2)
前提是:
a
b
b[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的乘积,因此这意味着/运算符优先于订阅。你知道吗
[1]
trailer
factor
/
这意味着:
相当于:
a += ((b[1]) / 2)
注意,由于Python是动态类型化的,所以解析(和分析)步骤不会保证表达式是sensical。例如一个元组不能被两个分开。因此这将导致TypeError:
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数组,这是有意义的:
numpy
>>> from numpy import array >>> array([2.0, 4.0])/2 array([1., 2.])
Python解析表达式的规则在Python grammar中定义。请注意,类型是不相关的。实际上Python是动态的类型,这意味着在解析和分析表达式时,变量的类型是未知的。事实上,一个变量在整个过程中具有不同的值(具有不同的类型),并且一行可以多次求值,每次变量都携带不同类型的值。你知道吗
如果我们看一下语法,就会发现:
“订阅”(
b[1]
中的[1]
因此在trailer
的产生式规则中定义,如果我们看语法,它只能是factor
的乘积,因此这意味着/
运算符优先于订阅。你知道吗这意味着:
相当于:
注意,由于Python是动态类型化的,所以解析(和分析)步骤不会保证表达式是sensical。例如一个元组不能被两个分开。因此这将导致
TypeError
:但是,对于
numpy
数组,这是有意义的:相关问题 更多 >
编程相关推荐