列表理解问题中的赋值表达式范围
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
最初是True
(0%2==0
),所以b
是为forloop 中的下一次迭代;但是如果从1
开始,就不是了。
例如,如果您尝试 range(2, n)
,它工作正常。
我 运行 在尝试解决我在 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
isTrue
, but you try to use b anyway.
我想补充一些解释。
从0
开始就可以了,因为f
最初是True
(0%2==0
),所以b
是为forloop 中的下一次迭代;但是如果从1
开始,就不是了。
例如,如果您尝试 range(2, n)
,它工作正常。