Python 列表理解问题中的赋值表达式作用域

Python 列表理解问题中的赋值表达式作用域,python,python-3.8,Python,Python 3.8,我在解决stackoverflow上看到的一个问题时遇到了一个问题 这是我的密码: 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()函数添加一个起始值时,我得到了一个错误,在赋值之前引用了

我在解决stackoverflow上看到的一个问题时遇到了一个问题

这是我的密码:

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

您的条件:

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

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

用户用户2357112是正确的

你的情况:

(f:=i%2==0) and (b:=i%5==0)
(f:=i%2==0)和(b:=i%5==0)
仅当
f
True
时才分配b,但您仍尝试使用b

我想补充一些解释

当您从
0
开始时,这是正常的,因为
f
首先是
True
0%2==0
),所以
b
是为forloop中的下一次迭代计算的;但如果从
1
开始,则不是


例如,如果您尝试使用
范围(2,n)
,它可以正常工作。

用户user2357112是正确的

你的情况:

(f:=i%2==0) and (b:=i%5==0)
(f:=i%2==0)和(b:=i%5==0)
仅当
f
True
时才分配b,但您仍尝试使用b

我想补充一些解释

当您从
0
开始时,这是正常的,因为
f
首先是
True
0%2==0
),所以
b
是为forloop中的下一次迭代计算的;但如果从
1
开始,则不是


例如,如果您尝试使用
范围(2,n)
,它可以正常工作。

不确定这是否是编写函数的Python方式。Pep20说:“简单比复杂好。”还有“可读性很重要”。那么,为什么不把它简化呢?我只是在尝试,我明白了!我想知道为什么!这就是学习的方法,我想我不确定这是否是编写函数的Python方式。Pep20说:“简单比复杂好。”还有“可读性很重要”。那么,为什么不把它简化呢?我只是在尝试,我明白了!我想知道为什么!我想这就是学习的方法,谢谢大家。我知道问题与短路评估有关,感谢大家。我知道问题与短路评估有关