如何能给字面量赋值?('a' = 10)

2 投票
3 回答
1246 浏览
提问于 2025-04-15 15:27
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'

那么 xy 都指向同一个对象,但像这样的赋值语句:

x += 'world'

或者

x = 'bacon'

会改变 x 的指向,让它指向其他东西。

3

k 不是一个字符串,它只是一个循环变量。你只是给它赋了一个新值,这样它就和你正在遍历的字典失去了关系。

撰写回答