Python Dictionary DataStructure哪个方法d []或d.get()?

时间:2011-10-03 07:02:17

标签: python data-structures

使用Python Dictionary DataStructure(包含键值对)如果我想从我的Dictionary中检索一些值,我有两个选项 d ['']和g.get('key')所以我现在很困惑哪个更好,为什么?我在某种程度上理解但是当涉及到内存消耗和内存中的评估哪一个更好?

希望得到一些积极的回复,

问候。

5 个答案:

答案 0 :(得分:30)

来自Python Library Docs

  

d[key]
  使用键返回 d 项。如果不在地图中,则引发KeyError

     

如果dict的子类定义方法__missing__(),如果键不存在,d[key]操作将使用键键<调用该方法/ em>作为参数。如果密钥不存在,d[key]操作将返回或引发__missing__(key)调用返回或引发的任何内容。没有其他操作或方法调用__missing__()。如果未定义__missing__(),则会引发KeyError__missing__()必须是一种方法;它不能是实例变量。 [...]

  

get(key[, default])
  如果 key 在字典中,则返回 key 的值,否则 default 。如果未给出默认,则默认为None,因此此方法永远不会引发KeyError

不同之处在于返回值。当您要求与不存在的键对应的值时,您要么

  1. KeyError提出
  2. 调用了一个回调
  3. 返回默认值
  4. Python通过多种方法提供不同的功能。

    在找不到密钥时,使用[]会导致性能下降,无论是调用_missing_还是引发异常。至于哪一个更快当密钥存在时,我检查了源代码。 (我使用2.7.2进行此项检查。)在dictobject.c我们看到:

    • get来电dict_get
    • []来电dict_subscript

    现在,如果值存在,我们在dict_get

    if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
        return NULL;
    
    if (!PyString_CheckExact(key) ||
        (hash = ((PyStringObject *) key)->ob_shash) == -1) {
        hash = PyObject_Hash(key);
        if (hash == -1)
            return NULL;
    }
    ep = (mp->ma_lookup)(mp, key, hash);
    

    并且dict_subscript我们有

    assert(mp->ma_table != NULL);
    if (!PyString_CheckExact(key) ||
        (hash = ((PyStringObject *) key)->ob_shash) == -1) {
        hash = PyObject_Hash(key);
        if (hash == -1)
            return NULL;
    ep = (mp->ma_lookup)(mp, key, hash);
    

    唯一的区别是get做了额外的解包元组!

    重要?我不知道。 : - )

答案 1 :(得分:4)

如果词典中不存在'key'

d['key']

会抛出KeyError,而

d.get('key')

将返回None

答案 2 :(得分:3)

不同之处在于,如果密钥丢失,d[key]将引发KeyError例外,而d.get(key)将返回None(而d.get(key, default)将返回默认值)。

内存要求没有明显差异。

答案 3 :(得分:0)

它们是不同的,特别是如果您的词典中没有该键(请参阅here

  

d[key]

     

用钥匙键返回d项。如果键不在地图中,则引发KeyError。

     

get(key[, default])

     

如果key在字典中,则返回key的值,否则返回   默认。如果未给出default,则默认为None,这样就可以了   方法永远不会引发KeyError。

答案 4 :(得分:0)

如果密钥存在,它们的行为都相同。但是,如果找不到密钥d['key']将引发KeyError例外,而d.get('key')将返回None。您还可以为get方法提供第二个参数,该参数将在未找到的条件下返回:如果找不到该键,d.get('key', '')将返回空字符串。