Python中的**展开dict一个值得注意的细节

2,388 阅读1分钟

在Python中,通过**来展开一个dict的应用非常广泛,我们可以通过这个语法为函数传递不确定的各种key-value参数。比如

def foo(**kwargs):
    print(kwargs)
    
# foo(a=1, b=2, c=3)
# foo(**{'a': 1, 'b': 2, 'c': 3})

这个我么需要说明一个细节,也就是在给上面的foo函数传递的参数中,key的类型只要是字符串就可以,并不一定需要使用合法的变量名。下面,使用上面的函数foo,我们可以在Python shell中做一些实验:

>>> f(**{'$': 1, '#': 2, '-': 3, '=': 4})
{'$': 1, '#': 2, '-': 3, '=': 4}

>>> f($=1)
  File "<stdin>", line 1
    f($=1)
      ^
SyntaxError: invalid syntax

可以看到各种带有特殊符号的字符串,都可以通过**传递到函数的参数中,但是在直接调用函数时就无法做到了。这就给很多地方的实现提供了很多便利。顺便提一下,在dict的key都是字符串的时候,new_dict = dict(x=1, y=2, **old_dict)这样的方式也可以很方便创建一个新的dict实例,很像javascript中通过...来展开并创建一个新的object的用法。