Python 列表理解问题中的赋值表达式作用域
我在解决stackoverflow上看到的一个问题时遇到了一个问题 这是我的密码: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()函数添加一个起始值时,我得到了一个错误,在赋值之前引用了
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说:“简单比复杂好。”还有“可读性很重要”。那么,为什么不把它简化呢?我只是在尝试,我明白了!我想知道为什么!我想这就是学习的方法,谢谢大家。我知道问题与短路评估有关,感谢大家。我知道问题与短路评估有关