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})
给我
<type 'str'> <type 'int'>
10
<type 'int'>
<type 'str'> <type 'int'>
10
<type 'int'>
所以我很困惑我怎么能这样做,因为k是一个字符串,所以不应该分配给它吗?
我显然做不到
In [35]: 'a' = 10
------------------------------------------------------------
File "<ipython console>", line 1
SyntaxError: can't assign to literal (<ipython console>, line 1)
答案 0 :(得分:5)
k
不是字符串,它是变量的名称。你可以轻松做到
k = 'a'
k = 10
没有任何问题,因为Python中的赋值语句将指定名称指向右侧的任何值。
正如你所提到的,字符串是不可变的,但这意味着作为一个对象,它没有你可以调用的方法,它会导致它修改它的数据。 Python中的每个变量总是可以指定为其他变量。
例如,如果你说
x = y = 'hello'
然后x
和y
都引用相同的对象,但是赋值语句如
x += 'world'
或
x = 'bacon'
会将x
的绑定更改为指向其他内容。
答案 1 :(得分:3)
k不是字符串,它只是一个循环变量。你刚给它分配了一些新的值,它失去了与你迭代的字典的关系。
答案 2 :(得分:1)
好吧,当你执行for k, v in args.items()
时,在第一个(也是唯一的,在你的情况下)迭代中,标识符k
开始指向字典“args”的当前键,这恰好发生在是一个字符串,对吗?
当你执行k = v
时,k
开始指向任何v
点,这恰好是一个整数。我在这里看不到太多问题。
如果我理解正确,python中的变量值是对象的引用。