假设我有这段代码:
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 中传递引用。
这对于像 str
、int
、tuple
等不可变对象(immutable对象)无关紧要,因为你不能改变它们,只有将名称指向不同的对象,但它适用于可变对象,如 list
、set
和 dict
。您需要习惯这一点并始终牢记这一点。
编辑: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/