在Effective Python一书中,作者建议使用赋值表达式来避免理解中的冗余,例如:
def fun(i):
return 2 * i
result = {x: y for x in [0, 1, 2, 3] if (y := fun(x)) > 3}
Run Code Online (Sandbox Code Playgroud)
代替
result = {x: fun(x) for x in [0, 1, 2, 3] if fun(x) > 3}
Run Code Online (Sandbox Code Playgroud)
result有价值{2: 4, 3: 6}。
作者指出
如果推导式在推导式的值部分使用海象运算符并且没有条件,它会将循环变量泄漏到包含范围中。[...] 最好不要泄漏循环变量,因此我建议仅在推导式的条件部分使用赋值表达式。
然而,在上面的例子中, y在程序结束时设置为 6。因此,赋值表达式中的变量泄漏了,尽管它是在条件中定义的。
列表推导式也会发生同样的事情:
>>> _ = [(x, leak) for x in range(4) if (leak := 2 * x) > 3]
>>> leak
6
Run Code Online (Sandbox Code Playgroud)
甚至对于生成器表达式:
>>> …Run Code Online (Sandbox Code Playgroud) 我正在 PyCharm 中设置远程 SSH 解释器,但是当我尝试在远程计算机上选择解释器的位置时,出现以下错误:
Indicated packet length 1952805748 too large
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?