Python:(**)的关联性未按预期运行
我有以下代码:Python:(**)的关联性未按预期运行,python,Python,我有以下代码: from __future__ import print_function a = lambda i=1: print('Line 1') or i if i else 1 b = lambda j=1: print('Line 2') or j if j else 2 c = lambda k=1: print('Line 3') or k if k else 3 d = lambda l=1: print('Line 4') or l if l else 4 q = a(
from __future__ import print_function
a = lambda i=1: print('Line 1') or i if i else 1
b = lambda j=1: print('Line 2') or j if j else 2
c = lambda k=1: print('Line 3') or k if k else 3
d = lambda l=1: print('Line 4') or l if l else 4
q = a(True)**b(True)**c(True)**d(True)
运算符**
是右关联的。因此,当解析器/解释器遍历q
中给出的字符串时,它应该调用d
,然后调用c
,然后。。。最后a
。对吗?没有
它打印:
第1行
第2行
第3行
第4行
开始这一切的原因是,我认为我可以想出一种非常聪明的方法来滥用运算符的关联性,以便在相同的连续行上向后打印字符串,因此,**
运算符序列的操作数将从左到右求值
语言规范中有以下注释:
因此,在幂运算符和一元运算符的非偶合序列中,运算符从右向左求值(这不限制操作数的求值顺序):-1**2
导致-1
请注意有关操作数求值顺序的部分。因此Python对a**b**c
的计算如下:
t1 = a
t2 = b
t3 = c
t4 = t2 ** t3
t5 = t1 ** t4
而t5
是表达式的值。因此,**
运算符序列的操作数将从左到右求值
语言规范中有以下注释:
因此,在幂运算符和一元运算符的非偶合序列中,运算符从右向左求值(这不限制操作数的求值顺序):-1**2
导致-1
请注意有关操作数求值顺序的部分。因此Python对a**b**c
的计算如下:
t1 = a
t2 = b
t3 = c
t4 = t2 ** t3
t5 = t1 ** t4
而t5
是表达式的值。借用
在幂运算符和一元运算符的非偶数序列中
操作符从右向左求值(这不限制
操作数的求值顺序)
这里有一些可以做你想做的事情-
from __future__ import print_function
print_list = [
lambda: print('Line 1') ,
lambda: print('Line 2') ,
lambda: print('Line 3') ,
lambda: print('Line 4') ,
]
_ = [f() for f in print_list[::-1]]
借用
在幂运算符和一元运算符的非偶数序列中
操作符从右向左求值(这不限制
操作数的求值顺序)
这里有一些可以做你想做的事情-
from __future__ import print_function
print_list = [
lambda: print('Line 1') ,
lambda: print('Line 2') ,
lambda: print('Line 3') ,
lambda: print('Line 4') ,
]
_ = [f() for f in print_list[::-1]]
它是右关联的,即
x**y**z==x**(y**z)
。您不知道的是,x**y
中的左侧总是在右侧之前求值。现在,问题是什么?哦!将来,是否有一份文件显示了这种比较?我查找了它,但找不到确切的来源。它是右关联的,即x**y**z==x**(y**z)
。您不知道的是,x**y
中的左侧总是在右侧之前求值。现在,问题是什么?哦!将来,是否有一份文件显示了这种比较?我查找了它,但找不到确切的源代码。“Python没有指定计算二进制运算符的操作数的顺序”-。它没有做的是将运算符的优先级或关联性与求值顺序联系起来。我在谷歌搜索中找不到这一点。谢谢你的链接。我修改了我的答案,“Python没有指定计算二进制运算符的操作数的顺序”-。它没有做的是将运算符的优先级或关联性与求值顺序联系起来。我在谷歌搜索中找不到这一点。谢谢你的链接。我已经修改了我的答案。