1 回答
TA贡献1843条经验 获得超7个赞
解包操作符*和**是非常有情境的——在这种情况下,只有在调用函数时才真正有用。这里的问题是您要解包的内容:只是元组,而不是整个列表理解。
您得到 a 是SyntaxError因为您尝试解包的元组不在可以正确解包的上下文中(并且 python 不知道您通过for之后执行循环来尝试做什么)。这是因为它并不直接在函数调用内部——它在生成器理解内部,它本身就在函数调用内部)。
您可能会做的另一种选择是添加另一组括号:
colors_new = dict.fromkeys( *((x,colors[x]) for x in ['col1','col2']) )
这相当于调用
colors_new = dict.fromkeys(('col1','Red'), ('col2','Blue'))
# colors_new = {'col1': ('col2', 'Blue'), 'Red': ('col2', 'Blue')}
这不是您想要做的,并且是由于对以下内容的误解dict.fromkeys():
fromkeys(iterable, value=None, /) method of builtins.type instance
Create a new dictionary with keys from iterable and values set to value.
dict.fromkeys恰好接受两个参数,并将所有键初始化为相同的值。如果你要传递一个额外的参数,你会得到一个错误。
如果您想dict用设置为不同值的不同键来初始化 a,那么有几种方法可以做到这一点。一方面,只需使用dict带有 2-tuples 的构造函数就可以了(不需要解包 uperator):
colors_new = dict((x, colors[x]) for x in ['col1', 'col2'])
# {'col1': 'Red', 'col2': 'Blue'}
或者你可以使用一种dict理解,它可能更优雅、更清晰:
colors_new = {k:v for k,v in colors.items() if k in {'col1', 'col2'}}
# {'col1': 'Red', 'col2': 'Blue'}
添加回答
举报