为什么将字典浅拷贝设置为它本身?

5
我认为这是一个有点奇怪的问题。
事实上,当我在学习一些Django代码的时候,我遇到了一些我从未见过的东西。
根据拷贝差异问题其在字典中的用法,我们可以创建两个具有相同引用的字典。
问题是将浅层复制的字典设置为自身的目的是什么?
代码:

django.template.backends.base

params = {
   'BACKEND' = 'Something',
   'DIRS' = 'Somthing Else',
}
params = params.copy()
1个回答

5

相关部分或 django.template.backends.base.py 如下:

class BaseEngine(object):

    # Core methods: engines have to provide their own implementation
    #               (except for from_string which is optional).

    def __init__(self, params):
        """
        Initializes the template engine.
        Receives the configuration settings as a dict.
        """
        params = params.copy()
        self.name = params.pop('NAME')
        self.dirs = list(params.pop('DIRS'))
        self.app_dirs = bool(params.pop('APP_DIRS'))
        if params:
            raise ImproperlyConfigured(
                "Unknown parameters: {}".format(", ".join(params)))

def __init__(self, params):中,字典params将被复制到一个新的字典params = params.copy()中。它只是使用相同的名称。因此,旧对象不能再通过这个名称访问。在接下来的步骤中,修改了新的本地字典,但原始的字典保持不变。
如果使用self.params = params而不是params = params.copy(),将会产生非常不同的效果。在这种情况下,self.params将只是params后面的对象的第二个名称。由于它是可变的字典,对self.params的所有更改都会影响paramsparams.pop('NAME')从字典中删除键NAME'。实际上,有一个检查它是否为空:params.pop('NAME')

根据你的说法,我理解他们只是复制了字典以使用它,而不是更改它,那为什么不使用:self.params = params呢? - Heartagramir
他们确实改变了它。我在我的回答中添加了一个关于这个的部分。 - Mike Müller
现在我明白了... 为了使用字典而不改变它,我们使用copy()。 而且还有... self.params不会为类创建一个新变量...它只是将变量复制以在特定对象内使用,但仍然是同一个对象。 - Heartagramir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接