使用**将字典传递给函数

时间:2014-07-07 23:53:56

标签: python python-3.x dictionary

我试图理解以下内容。

 def exp(**argd):
     print(argd)

  a={1:'a',2:'b'}
  exp(**a)

This will give TypeError: exp() keywords must be strings. 

如果我使用= {' 1':' a'' 2'' b'},这种方式可以正常工作。为什么我不能将字典键作为数字传递给exp函数?

2 个答案:

答案 0 :(得分:3)

您的示例中的

exp(**a)从字面上扩展为exp(1='a', 2='b'),这是一个错误,因为整数文字不能是变量名。

您可能会想,为什么**流程不会将密钥转换为字符串作为扩展的一部分?没有一个单一的理由,但一般来说Python的哲学是"显式优于隐式",隐式转换可能有一些陷阱 - 许多对象类型不同于每个例如,其他将转换为相同的字符串,如果您在扩展期间依赖隐式字符串转换,则可能会导致意外后果。

答案 1 :(得分:2)

因为你不能(Guido可能是唯一可以告诉你原因的人)......这使得他们部分遵守变量命名规则...... **a_dict解包dict

a={1:'a',2:'b'}
exp(**a)  #is basically exp(1='a',2='b') 

这显然是语法错误

虽然它确实允许有趣的事情,如

a = {'a variable':7,'some$thing':88}
exp(**a)

只要它们是字符串......似乎它们强制执行的唯一规则是它们是字符串......这可能保证它们是可以清洗的(猜测很大......)

免责声明:这可能是一个粗略的过度简化