def foo(**args):
for k, v in args.items():
print type(k), type(v)
for k, v in args.items():
k = v
print k
print type(k)
foo(a = 10)
foo(**{'a':10})
Run Code Online (Sandbox Code Playgroud)
给我
<type 'str'> <type 'int'>
10
<type 'int'>
<type 'str'> <type 'int'>
10
<type 'int'>
Run Code Online (Sandbox Code Playgroud)
所以我很困惑,我怎么能这样做,因为k是一个字符串,所以我不能分配给它?
我显然做不到
In [35]: 'a' = 10
------------------------------------------------------------
File "<ipython console>", line 1
SyntaxError: can't assign to literal (<ipython console>, line 1)
Run Code Online (Sandbox Code Playgroud)
k不是字符串,它是变量的名称.你可以轻松做到
k = 'a'
k = 10
Run Code Online (Sandbox Code Playgroud)
没有任何问题,因为Python中的赋值语句将指定名称指向右侧的任何值.
正如你所提到的,字符串是不可变的,但这意味着作为一个对象,它没有你可以调用的方法,它会导致它修改它的数据.Python中的每个变量都可以指定为指向其他变量.
例如,如果你说
x = y = 'hello'
Run Code Online (Sandbox Code Playgroud)
那么这两个x并y指向同一个对象,但赋值语句一样
x += 'world'
Run Code Online (Sandbox Code Playgroud)
要么
x = 'bacon'
Run Code Online (Sandbox Code Playgroud)
将改变绑定x指向别的东西.