如何能给字面量赋值?('a' = 10)
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)
3 个回答
1
好吧,当你写 for k, v in args.items()
时,在第一次(也是唯一一次,在你的例子里)循环中,变量 k
开始指向字典 "args" 中的当前键,而这个键恰好是一个字符串,对吧?
当你执行 k = v
时,k
开始指向 v
所指向的内容,而 v
恰好是一个整数。我觉得这里没有什么问题。
如果我理解得没错,Python 中变量的值是 指向对象的引用。
5
k
不是一个字符串,它是一个变量的名字。你可以很简单地这样做:
k = 'a'
k = 10
没有任何问题,因为在Python中,赋值语句会把变量名指向右边的值。
字符串是不可变的,正如你提到的,这意味着作为一个对象,它没有任何方法可以直接修改它的数据。Python中的每个变量都可以随时被重新指向其他东西。
举个例子,如果你说:
x = y = 'hello'
那么 x
和 y
都指向同一个对象,但像这样的赋值语句:
x += 'world'
或者
x = 'bacon'
会改变 x
的指向,让它指向其他东西。
3
k 不是一个字符串,它只是一个循环变量。你只是给它赋了一个新值,这样它就和你正在遍历的字典失去了关系。