Python:(**)的相关性不符合要求

时间:2014-03-08 04:27:44

标签: 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(True)**b(True)**c(True)**d(True)

运算符**是右关联的。因此,当解析器/解释器遍历q中给出的字符串时,它应该调用d然后调用c然后调用... a。对?不。

它打印:   第1行   第2行   第3行   第4行

所有这一切的开始是我认为我可以想出一种非常聪明的方法来滥用操作员关联性,以便在将字符串放在相同的连续行上时向后打印字符串,following the instructions from this closed golf post

2 个答案:

答案 0 :(得分:4)

Python specifies that expressions are, in general, evaluated left-to-right.因此,**运算符序列的操作数将从左到右进行评估。

语言规范在the description of the power operator中有此注释:

  

因此,在功率和一元运算符的未加密集的序列中,运算符从右到左进行求值(这不会限制操作数的求值顺序):-1**2得到-1。< / p>

请注意有关操作数的评估顺序的部分。所以Python会像这样评估a ** b ** c

t1 = a
t2 = b
t3 = c
t4 = t2 ** t3
t5 = t1 ** t4

t5是表达式的值。

答案 1 :(得分:0)

借鉴What is the associativity of Python's ** operator?

  

在一个不明确的权力和一元运算符序列中,   运算符从右到左进行评估(这不受约束   操作数的评估顺序)。

这是可以做你想做的事情 -

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]]