UnboundLocalError: local variable referenced before assignment within comprehension

UnboundLocalError: local variable referenced before assignment within comprehension

我正在尝试 dict 理解,并尝试 PEP572:= 运算符),在这样的示例中:

columns = {'idx', 'class_name'}
# populate them somehow
# ...
retval = {names[idx]:idx for idx in range(len(names)) if (names := list(columns))}

所以基本上,一个 dict 包含 set 中的项目和一个迭代它的值。 但是,names 似乎是 UnboundLocalError

下面是我正在尝试做的,捕获理解范围的外部变量的别名:

names = list(columns)
retval = {names[idx]:idx for idx in range(len(names))}

为什么会出错?

编辑

在捕获的 columns 中尝试此操作:

retval = {names[idx]:idx for idx in range(len(names:= list(columns)))}

产生了更有意义的恕我直言错误:

SyntaxError: assignment expression cannot be used in a comprehension iterable expression

所以,正如下面的回答,这不是海象运算符的使用方式。

您滥用了条件。每个从迭代器中检索到的值都会计算一次;它不能用于定义 迭代器。当您尝试计算 len(names).

时,names 尚未定义

在可以使用 enumerate 的时候使用 range 无论如何都是一种反模式;尝试

retval = {name: idx for idx, name in enumerate(columns)}

请注意 columns 无论如何都没有可靠的排序;集不会像 dicts 那样保留项目的添加顺序。