小编and*_*ino的帖子

如何避免推导式中 Python 赋值表达式的泄漏

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)

python python-assignment-expression

6
推荐指数
1
解决办法
111
查看次数

在 PyCharm 中使用远程解释器时出现“指示数据包长度太大”错误

我正在 PyCharm 中设置远程 SSH 解释器,但是当我尝试在远程计算机上选择解释器的位置时,出现以下错误:

Indicated packet length 1952805748 too large
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?

错误消息的屏幕截图

sftp pycharm

4
推荐指数
1
解决办法
6989
查看次数