UnboundLocalError:在理解中赋值之前引用的局部变量

问题描述

我正在尝试使用 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

因此,如下所述,这不是海象运算符的使用方式。

解决方法

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

在可以使用 range 的情况下使用 enumerate 无论如何都有些反模式;试试

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

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