为什么要为自己设置一个字典浅拷贝?
Why setting a dict shallow copy to itself?
我觉得这个问题有点奇怪。
问题是,当我研究 django 代码的某些部分时,我遇到了一些我以前从未见过的东西。
根据 Copy Difference Question 和
It's usage in dictionary 我们可以创建两个具有相同引用的字典。
问题是将字典的浅表副本设置为自身的目的是什么?
代码:
django.template.backends.base
params = {
'BACKEND' = 'Something',
'DIRS' = 'Somthing Else',
}
params = params.copy()
相关部分或 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
的所有更改都会影响 params
。 params.pop('NAME')
删除密钥 NAME'
来自字典。实际上,检查它是否为空:params.pop('NAME')
.
我觉得这个问题有点奇怪。
问题是,当我研究 django 代码的某些部分时,我遇到了一些我以前从未见过的东西。
根据 Copy Difference Question 和
It's usage in dictionary 我们可以创建两个具有相同引用的字典。
问题是将字典的浅表副本设置为自身的目的是什么?
代码:
django.template.backends.base
params = {
'BACKEND' = 'Something',
'DIRS' = 'Somthing Else',
}
params = params.copy()
相关部分或 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
的所有更改都会影响 params
。 params.pop('NAME')
删除密钥 NAME'
来自字典。实际上,检查它是否为空:params.pop('NAME')
.