如何使用 Python 中的 walrus 运算符执行赋值解构

Aus*_*tin 7 python destructuring python-3.x python-3.8

我可以做一个赋值解构:

a, b = s.split(' ', 1)
Run Code Online (Sandbox Code Playgroud)

对于s包含多个单词的字符串。

我们如何使用 Python 3.8 中引入的最新赋值表达式(是否可能有多个目标)在 an ifor 中做同样的事情elif

我试过:

if some_thing:
    # some code.
elif (a, b := s.split(' ', 1)) and some_func(a) and some_func(b):
    # some code probably using a and b as well.
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

elif (a, b := s.split(' ', 1)) and some_func(a) and some_func(b):
NameError: name 'a' is not defined
Run Code Online (Sandbox Code Playgroud)

我想要这个的原因是因为如果我的第一个条件得到满足,我不想不必要地拆分我的字符串。

Alf*_*lfe 10

如果您尝试在指定元组周围加上括号,错误消息会更清晰,并告诉您有关问题的信息:

if ((a, b) := s.split(' ', 1)):
  ...
Run Code Online (Sandbox Code Playgroud)

这将导致一个SyntaxError: cannot use assignment expressions with tuple. 这就是重点:目前海象运算符不允许拆包分配。我也没有关于未来是否计划这样做的信息。(也许甚至有一个逻辑原因,我无法弄清楚为什么这根本不可能。)鉴于他们剥离了函数参数列表中的解包功能(当从 Python2 迁移到 Python3 时),我不期望它。

因此,您在这里所能做的就是分配给单个变量并稍后对其建立索引的解决方法。


Nei*_*eil 4

请参阅有关重新分配给元组的问题的评论。但我绝不是专家。发布以下内容是因为它有效并且我认为它对您来说可能足够好?基本上,将元组保存到一个有效的变量中,然后您可以对其进行索引

if some_thing:
    # some code.
elif (split := s.split(' ', 1)):
    if some_func(split[0]) and some_func(split[1]):
        # some code probably using a and b as well.
Run Code Online (Sandbox Code Playgroud)

  • 感谢你的回答。我知道这对于正常的任务是有效的;热衷于如何进行解构。但我想你是对的,我们不能像我那样做。顺便说一句,您可以将下面的“elif”和“if”与“and”结合在一起。 (3认同)