为何修改Python字典values()视图无法同步更改原字典?
为什么修改字典values视图的循环变量不会改变原字典?
先看你给出的两种写法:
第一种通过items()遍历键值对,直接修改字典的键对应值,能成功更新:
dct = {1: 'one', 2: 'two', 3: 'three'} for key, value in dct.items(): dct[key] = 'new' print(dct) # {1: 'new', 2: 'new', 3: 'new'}
第二种遍历values()视图,给循环变量赋值却没效果:
dct = {1: 'one', 2: 'two', 3: 'three'} for value in dct.values(): value = 'new' print(dct) # {1: 'one', 2: 'two', 3: 'three'}
核心原因:你根本没修改视图里的元素,只是给循环变量重新赋值了
循环变量
value只是引用副本
当你遍历dct.values()时,每次循环的value只是拿到了字典值的引用。但对于字符串这种不可变类型,你没法通过这个引用来修改原对象——因为不可变类型本身不支持原地修改。value = 'new'这个操作,只是让value变量指向了一个新的字符串对象,完全和原字典里的那个字符串没关系。视图的“动态”是单向的
官方文档说的“动态视图”,指的是原字典修改后,视图会同步反映变化(比如你在遍历视图时给字典新增键,视图会立刻包含这个新值),但反过来,视图并不支持直接修改来同步回字典——而且对于不可变值,你连“修改视图元素”的操作都做不到,只能重新给字典的键赋值。
验证:可变类型值的情况
如果字典里的是列表这种可变类型,你修改value指向的对象内容,原字典就会跟着变,因为这时value和原字典里的列表是同一个引用:
dct = {1: ['one'], 2: ['two']} for value in dct.values(): value[0] = 'new' print(dct) # {1: ['new'], 2: ['new']}
结论
- 要修改字典的值,要么通过键直接赋值(
dct[key] = 新值),要么对于可变类型值,修改其内部元素 values()视图的动态性是单向的:字典变→视图变,而非视图变→字典变
内容的提问来源于stack exchange,提问作者Roman Toasov
相关产品推荐
相关产品推荐

