列表理解问题中的赋值表达式范围

Assignment expression scoping in list comprehension problem

我 运行 在尝试解决我在 Whosebug 上看到的问题时遇到了问题。 link

这是我的代码:

def fizz_buzz(n):
    return ['fizzbuzz' if (f:=i%2==0) and (b:=i%5==0) else 'fizz' if f else 'buzz' if b else i for i in range(n)]
print(fizz_buzz(70)) 

上面的代码完美运行,但是当我尝试向 range() 函数添加一个起始值时,我得到一个错误,即赋值前引用的自由变量 'b'。

我不明白为什么会这样

您的情况:

(f:=i%2==0) and (b:=i%5==0)

仅在 f 为真时才分配 b,但您仍然尝试使用 b

用户user2357112是对的。

Your condition:

(f:=i%2==0) and (b:=i%5==0)

only assigns b if f is True, but you try to use b anyway.

我想补充一些解释。

0开始就可以了,因为f最初是True0%2==0),所以b是为forloop 中的下一次迭代;但是如果从1开始,就不是了。

例如,如果您尝试 range(2, n),它工作正常。