为什么要为自己设置一个dict浅拷贝?

时间:2015-12-12 10:00:41

标签: python django dictionary shallow-copy

我认为这是一个有点奇怪的问题 问题是,当我研究django代码的某些部分时,我遇到了一些我以前从未见过的东西 根据{{​​3}}和 Copy Difference Question我们可以创建两个带有相同引用的字典。

问题是将字典的浅层副本设置为自身的目的是什么? 代码:

  

django.template.backends.base

params = {
   'BACKEND' = 'Something',
   'DIRS' = 'Somthing Else',
}
params = params.copy()

1 个答案:

答案 0 :(得分: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)))

params中的字典def __init__(self, params):将被复制到字典params = params.copy()。它只使用相同的名称。因此,无法通过此名称访问旧对象。在接下来的步骤中,修改了新的本地字典,但原始字典保持不变。

执行self.params = params而不是params = params.copy()会产生非常不同的效果。在这种情况下,self.params只是params后面对象的第二个名称。由于它是字典且可变,因此self.params的所有更改都会影响paramsparams.pop('NAME')删除密钥NAME' 来自字典。实际上,检查它是否为空:params.pop('NAME')