Python 使用字典更改列表中的项目

Python 使用字典更改列表中的项目,python,list,dictionary,replace,Python,List,Dictionary,Replace,名单没有改变。我原以为列表会改为['1','2']。有人能解释一下吗?尝试使用索引而不是变量 dic = {'a':'1','b':'2'} lis = ['a','b'] for c in lis: c = dic[c] print lis 此外,切勿将list用作变量名。 或者使用枚举等 for i in range(len(li)): c = li[i] li[i] = dic[c] print li 或列表理解 for i, c in enumerate(li

名单没有改变。我原以为列表会改为
['1','2']
。有人能解释一下吗?

尝试使用索引而不是变量

dic = {'a':'1','b':'2'}
lis = ['a','b']
for c in lis:
    c = dic[c]
print lis
此外,切勿将
list
用作变量名。
或者使用
枚举

for i in range(len(li)):
    c = li[i]
    li[i] = dic[c]
print li
或列表理解

for i, c in enumerate(li):
    li[i] = dic[c]
print li

为什么不告诉我你在做什么?
当您对y中的x使用
时:
x
获取y中的对象/项的值
y

因此,如果您更改
x
的值,则不会更改
y[i]
的值,
i
是您所在的索引

所以,如果你这样做

lis = [dic[c] if c in dic else c for c in lis]

您将看到差异

不,列表迭代不是这样工作的
c
在每次迭代中都是一个新对象,如果您更改了该对象,原始列表(谢天谢地!)不会被修改

如果确实需要,请使用
enumerate()


迭代过程中缺少的最重要的一点是,将元素指定给名称
c
c=dic[c]
会将
c
重新绑定到新对象,而不会就地更新原始对象。考虑下面的演示

dic = {'a':'1','b':'2'}
lis = ['a','b']
for i, c in enumerate(lis):
    lis[i] = dic[c]
print lis
因此,虽然在赋值之前,list元素和
c
都引用列表中的同一对象,但赋值字典只会更改引用

注意,这里
id
仅指引用对象的标识符

注意,当您更改整个列表时,使用列表理解更容易、更快

>>> for i, c in enumerate(lst):
    print id(c), id(lst[i]),
    c=dic[c]
    print id(c)


4935168 4935168 4934712
4935192 4935192 5496728
警告Don;t在执行此操作时,将变量命名为内置的

lst = [dic[e] for e in lst]
['1', '2']
您正在将名称
c
重新绑定到任何“某物”,在本例中为
dic[c]
处的值。为了让Python真正“进入”列表,您必须调用该列表上的一个方法--method
list.\uuuu setitem\uuu()
告诉Python访问实际的列表对象并对该列表中的一个项进行变异,而不是简单的变量赋值

for c in myList:
    c = something
当然,这也可以写成(更具python风格):


它看起来像一个变量赋值,但实际上不是。

谢谢您的解释。
for c in myList:
    c = something
for i, c in enumerate(myList):
    myList.__setitem__(dic[c])
for i, c in enumerate(myList):
    myList[i] = dic[c]