我正在尝试在Python 3.6中编写函数spread
(我不能使用任何较新的版本),到目前为止,我已经有了类似这样的东西:
d = {"a": 1, "b": 2, "c": 3}
a, b, c = spread(d, ['a', 'b', 'c'])
a
>> 1
b
>> 2
c
>> 3
问题是:存在某种重复,因为左侧的位置必须与函数第二个参数上的键列表匹配才能使其有意义。因此,更改键列表的顺序,变量a
将与d['a']
保持不同值。我要保持一致性
a, b, c = spread(d) # how?
或spread(d, ???)
。我不考虑使用a, b, c
初始化None
,然后将它们作为列表传递。
关于如何处理此问题的任何想法或线索?可能吗 谢谢!
答案 0 :(得分:4)
不,这实际上是不可能的。您不能拥有
a, b, c = spread(d)
和
a, c, b = spread(d)
将相同的值赋予b
。这是因为the right side of an assignment statement is evaluated first。因此,spread
将执行并返回其值,直到您的代码知道将它们放在左边的顺序。
一些谷歌搜索线索被认为是,通过“字典的类似散布的语法”,您正在寻找**dict
语法。参见What does ** (double star/asterisk) and * (star/asterisk) do for parameters?
答案 1 :(得分:1)
globals().update(d)
会执行您的要求,但是...
locals()
返回可写字典。答案 2 :(得分:0)
您可以将变量分配给values()调用的结果:
>>> d = {"a": 1, "b": 2, "c": 3}
>>> a,b,c = d.values()
>>> a
1
>>> b
2
>>> c
3
我不建议在不保证dict排序的Python版本中执行此操作,但幸运的是,此操作应在3.6及更高版本中起作用。
答案 3 :(得分:0)
不是很漂亮,但是您可以在那做些事情:
def f1(a, b, c, **_):
print(a)
print(b)
print(c)
d = {"a": 1, "b": 2, "c": 3}
f1(**d)
非常不同的语义,但希望它能激发灵感!