dict.get()方法返回一个指针 [英] dict.get() method returns a pointer

查看:398
本文介绍了dict.get()方法返回一个指针的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我有这个代码:

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

#获取有关约翰的信息,或默认dict
item = my_dict.get('john',default_value)

#编辑数据
item [surname] ='smith'
item [age] = 68

my_dict ['john'] = item

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

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

很明显, my_dict.get()没有返回default_value的,而是返回一个指针(?)。



可以通过将代码更改为:

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

但这似乎不是一个很好的方式来做到这一点。任何想法,评论?

解决方案

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

您始终在Python中传递引用



这对于不可变的对象(如 str int tuple 等,因为您无法更改它们,只能在不同的对象上指定一个名称,但它对于可变对象(如 list set dict 。您需要习惯这一点,并始终牢记这一点。



编辑: Zach Bloom和Jonathan Sternberg都指出可以使用的方法以避免在每次查找时调用复制。您应该使用 defaultdict 方法,像Jonathan的第一个方法,或者:

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

如果如果密钥几乎总是存在于 my_dict 如果 dict 很大。您不必将其包装在一个功能中,但是每次访问 my_dict 时,您可能不希望这四行。



请参阅Jonathan的答案,其中有一个小的 dict get 方法在我测试的所有大小上执行得不好,但是 try >

Let's say I have this code:

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

The problem becomes clear, if we now check the value of default_value:

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

It is obvious, that my_dict.get() did not return the value of default_value, but a pointer (?) to it.

The problem could be worked around by changing the code to:

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

but that doesn't seem to be a nice way to do it. Any ideas, comments?

解决方案

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

You're always passing a reference in Python.

This doesn't matter for immutable objects like str, int, tuple, etc. since you can't change them, only point a name at a different object, but it does for mutable objects like list, set, and dict. You need to get used to this and always keep it in mind.

Edit: Zach Bloom and Jonathan Sternberg both point out methods you can use to avoid the call to copy on every lookup. You should use either the defaultdict method, something like Jonathan's first method, or:

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

This will be faster than if when the key nearly always already exists in my_dict, if the dict is large. You don't have to wrap it in a function but you probably don't want those four lines every time you access my_dict.

See Jonathan's answer for timings with a small dict. The get method performs poorly at all sizes I tested, but the try method does better at large sizes.

这篇关于dict.get()方法返回一个指针的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆