Python dask中的奇怪行为应用于lambda函数的循环

Python dask中的奇怪行为应用于lambda函数的循环,python,lambda,scope,dask,Python,Lambda,Scope,Dask,我不确定这是dask的bug还是python的特性。简单的例子: data = pd.DataFrame({'tags': [['dog'], ['cat', 'red'], ['cat'], ['cat', 'red'], ['cat', 'red'], ['dog', 'red']]}) print data tags 0 [dog] 1 [cat, red] 2 [cat] 3 [cat, red] 4 [cat, red] 5 [do

我不确定这是dask的bug还是python的特性。简单的例子:

data = pd.DataFrame({'tags': [['dog'], ['cat', 'red'], ['cat'], ['cat', 'red'], ['cat', 'red'], ['dog', 'red']]})
print data

          tags
0       [dog]
1  [cat, red]
2       [cat]
3  [cat, red]
4  [cat, red]
5  [dog, red]
我想为每个标签创建“热列”

tags = ['cat', 'dog', 'red']
使用dask:

data = dd.from_pandas(data, npartitions=4)

for tag in tags:
    data[tag] = data.tags.apply(lambda x: tag in x, meta=(tag, bool))
结果是错误的:

print data.compute()
         tags    cat    dog    red
0       [dog]  False  False  False
1  [cat, red]   True   True   True
2       [cat]  False  False  False
3  [cat, red]   True   True   True
4  [cat, red]   True   True   True
5  [dog, red]   True   True   True
似乎
lambda
总是绑定到循环中的最后一个标记(
red
)。如果我手动展开循环,它将正常工作

使用普通熊猫我没有这个问题

部分解 我不太喜欢它,因为它迫使论点的顺序变得很不自然。顺便说一句,我不确定是否理解了最初的问题。

答案就在这里:这是关于python的词法范围

更好的解决方案:使用lambda的默认值

for tag in tags:
    data[tag] = data.tags.apply(lambda x, t=tag: t in x, meta=(tag, bool))
for tag in tags:
    data[tag] = data.tags.apply(lambda x, t=tag: t in x, meta=(tag, bool))