Python中在循环中修改字典值
改变字典值的最简方式是(不使用一行代码)
# process array with loop
dct = {1: 'one', 2: 'two', 3: 'three'}
for key, value in dct.items():
dct[key] = 'new'
print(dct)
#{1: 'new', 2: 'new', 3: 'new'}
根据Python手册,.values()
的意思是“返回字典值的新视图”,而视图的意思是“提供字典条目的动态视图,这意味着当字典发生变化时,视图会反映这些变化。”
那为什么不反过来,改变视图不会动态改变字典呢?
dct = {1: 'one', 2: 'two', 3: 'three'}
for value in dct.values():
value = 'new'
print(dct)
#{1: 'one', 2: 'two', 3: 'three'}
2 个回答
1
我可以用一个简单的列表比喻:
lst = ['a','b','c']
for value in lst:
value ='new'
现在,如果你用 print(lst)
打印出来,你会得到什么呢?
print(lst)
#['a','b','c']
同样,字典也是不会改变的,
dct = {1: 'one', 2: 'two', 3: 'three'}
for value in dct.values():
value = 'new'
print(dct)
#{1: 'one', 2: 'two', 3: 'three'}
正如 @ForceBru 所评论的那样
像 value = 'new'
这样的赋值操作并不会修改之前“存储”在 value
中的对象。
1
这主要是因为字典的键和值之间的关系。
在Python中,当你用 for value in dct.values():
来遍历字典的值时,变量 value
只是指向字典中某个值的一个引用。当你给 value
赋一个新值时,其实只是改变了 value
指向的内容,并没有改变字典里原本的值。
下面是具体发生了什么:
- 在循环
for value in dct.values():
中,value
会一个一个地被赋值为字典里的每个值。 - 当你执行
value = 'new'
时,你只是把value
的指向改成了字符串 'new'。 - 这个赋值操作并不会改变字典
dct
中原来的值。
所以,要想改变字典里的值,你需要用键来直接访问和修改字典的值,就像你之前提到的那样。