我试图理解以下内容。
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函数?
答案 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)
只要它们是字符串......似乎它们强制执行的唯一规则是它们是字符串......这可能保证它们是可以清洗的(猜测很大......)
免责声明:这可能是一个粗略的过度简化