当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么设置一个dict浅拷贝到自己?》经验,为你挑选了1个好方法。

我想这是一个有点奇怪的问题.
问题是,当我研究django代码的某些部分时,我遇到了一些我以前从未见过的东西.
根据复制差异问题及其 在字典中的用法,我们可以创建两个具有相同引用的字典.

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

django.template.backends.base

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

Mike Müller.. 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)))

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

self.params = params,而不是params = params.copy()会有一个非常不同的效果.在这种情况下self.params,它只是后面对象的第二个名称params.由于它是一本字典并且可变,所有的变化self.params都会起作用params. 从字典中params.pop('NAME')删除密钥NAME'.实际上,检查它是空的:params.pop('NAME').



1> Mike Müller..:

相关部分或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)))

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

self.params = params,而不是params = params.copy()会有一个非常不同的效果.在这种情况下self.params,它只是后面对象的第二个名称params.由于它是一本字典并且可变,所有的变化self.params都会起作用params. 从字典中params.pop('NAME')删除密钥NAME'.实际上,检查它是空的:params.pop('NAME').

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有