python - dict.get() 方法返回一个指针

标签 python dictionary pass-by-reference

假设我有这段代码:

my_dict = {}
default_value = {'surname': '', 'age': 0}

# get info about john, or a default dict
item = my_dict.get('john', default_value)

# edit the data
item[surname] = 'smith'
item[age] = 68

my_dict['john'] = item

如果我们现在检查 default_value 的值,问题就变得很清楚了:

>>> default_value
{'age': 68, 'surname': 'smith'}

很明显,my_dict.get() 返回的不是 default_value 的 value,而是指向它的指针 (?)。

可以通过将代码更改为来解决此问题:

item = my_dict.get('john', {'surname': '', 'age': 0})

但这似乎不是一个好的方法。有什么想法、意见吗?

最佳答案

item = my_dict.get('john', default_value.copy())

总是在 Python 中传递引用。

这对于像 strinttuple 等不可变对象(immutable对象)无关紧要,因为你不能改变它们,只有将名称指向不同的对象,但它适用于可变对象,如 listsetdict。您需要习惯这一点并始终牢记这一点。

编辑:Zach Bloom 和 Jonathan Sternberg 都指出了可以用来避免在每次查找时调用 copy 的方法。您应该使用 defaultdict 方法,类似于 Jonathan 的第一种方法,或者:

def my_dict_get(key):
    try:
        item = my_dict[key]
    except KeyError:
        item = default_value.copy()

当键几乎总是已经存在于 my_dict 中时,这将比 if 更快,如果 dict 很大.您不必将它包装在一个函数中,但您可能不希望每次访问 my_dict 时都使用这四行。

请参阅 Jonathan 的回答,了解带有小型 dict 的计时。 get 方法在我测试的所有尺寸上都表现不佳,但 try 方法在大尺寸上表现更好。

关于python - dict.get() 方法返回一个指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7153893/

相关文章:

python - 使用字典查找文本文件中出现次数最多的单词

c++ - 在 C++ 中通过引用传递对象

python - 查询在 phpmyadmin 上执行,但不在 python 脚本中执行

python - 如何删除 influxDB 中的点

java - 如何使用 Google 集合将 List<String> 转换为 Map<String,String>?

python - 为什么字典花费的时间比在 python 中设置的时间少?

c - GDB: "warning: Range for type <error type> has invalid bounds"

java - 这是如何适应java中的 "pass by value of refrences"的?

python - 在 Python 上返回 None

python - 从 Anaconda 访问 pip 包