分配给表达式(而不是名称)在 Python 中很常见。例如,这是完全有效的语法:
my.object["with_some"].very_long["expression"] = func(my.object["with_some"].very_long["expression"], my.object["with_some"].very_long["expression"])
但是,如果我尝试使用海象运算符通过使 LHS 成为命名表达式来缩短它,例如
(x:=my.object["with_some"].very_long["expression"]) = func(x, x)
Python 引发了一个 SyntaxError:
SyntaxError:无法分配给命名表达式
同样,for x[0] in range(5)
is 有效的语法(只是非常混乱),而for (a:=x[0]) in range(5)
is 又是SyntaxError: cannot assign to named expression
.
为什么我不能分配给命名表达式?这是设计还是实现?
PEP 572提到了一些不能使用海象运算符的情况,但除了一种情况外,所有情况都是关于无括号表达式的语法,最后一种情况是关于 f 字符串。与此答案( )中指出的情况不同,(self.x := ...)
在我的情况下,海象运算符中的赋值目标是一个简单的名称/标识符,而不是表达式。从语言参考中也不清楚为什么不允许这样做。 今天在谷歌上搜索错误消息在撰写本文时恰好产生了三个结果:一个关于理解限制的问题,一个Stack Overflow 聊天消息,期望有数百个热门网络问题(没有发生),以及第 3 方 Python 解析器中的问题;没有人帮助我。
我无法分配给命名表达式的原因是什么?这是在某处记录或定义的设计规则,还是实施限制?据我所知,它不会导致任何歧义,而且我的用例似乎应该是有效的。