Python 得到一个;参考资料;当dict或list值是不可变对象时

Python 得到一个;参考资料;当dict或list值是不可变对象时,python,Python,当使用字典时,我发现自己想要迭代这些值并以某种方式更改它们。我一直在编写myDict.keys()上的循环,然后对myDict['key']进行更改。特别是如果我需要在每次迭代中对值进行许多更改,我最终会输入大量详细的括号语法,以便在字典中反复获得相同的值。创建嵌套对象只会使问题变得更糟。即使值的类型是不可变的,在字典中对值进行“别名”或“引用”的最佳做法是什么?只需将对象存储在变量中即可。它将引用字典中存储的完全相同的值 x = dictionary['nested']['keys'] # D

当使用字典时,我发现自己想要迭代这些值并以某种方式更改它们。我一直在编写
myDict.keys()
上的循环,然后对
myDict['key']
进行更改。特别是如果我需要在每次迭代中对值进行许多更改,我最终会输入大量详细的括号语法,以便在字典中反复获得相同的值。创建嵌套对象只会使问题变得更糟。即使值的类型是不可变的,在字典中对值进行“别名”或“引用”的最佳做法是什么?

只需将对象存储在变量中即可。它将引用字典中存储的完全相同的值

x = dictionary['nested']['keys']
# Do stuff with x
如果它是可变对象,则对
x
所做的任何更改都将影响字典中的值。如果它是一个不可变的对象,那么无论如何都不能进行任何更改,所以这无关紧要

如果您希望能够实际设置字典引用的不可变对象,但不希望继续引用字典键,那么可以使用和库动态地创建getter和setter部分函数对象

from operator import getitem, setitem
from functools import partial

d = {'a': {'b': 1}}
getter = partial(getitem, d['a'], 'b')
setter = partial(setitem, d['a'], 'b')

print getter()
# 1
setter(2)
print d
# {'a': {'b': 2}}

是的,我对使用不可变很感兴趣,虽然我知道我从不改变不可变,只是替换它,但我想要某种语法,允许您的代码示例将X放在任何赋值运算符的左边,并始终影响dict中的值(或者在不可变的情况下替换它)。