18

私はdictこのようなものを持っています:

>>> my_dict = {u'2008': 6.57, u'2009': 4.89, u'2011': 7.74,
...            u'2010': 7.44, u'2012': 7.44}

出力has_key:

>>> my_dict.has_key(unicode(2012))
True

出力hasattr:

>>> hasattr(my_dict, unicode(2012))
False

なぜこれが異なる動作をするのか理解できませんでした。dict私はググって、オブジェクトが異なるためであることがわかりました。

しかし、それでも私はその違いを正しく理解できませんでした。

(ところで:私はpython 2.7を使用しています)

4

5 に答える 5

2

my_dict.has_key(unicode(2012)):has_key辞書でキーを探します。ディクショナリのキーは属性ではなく、

hasattr(オブジェクト、名前)

引数はオブジェクトと文字列です。文字列がオブジェクトの属性の 1 つの名前である場合、結果は True になり、そうでない場合は False になります。(これは getattr(object, name) を呼び出し、例外が発生するかどうかを確認することで実装されます。)

ここから、dict はオブジェクトですが、dict のキーは dict の属性ではないことがわかります。

于 2013-07-20T10:38:19.510 に答える
1

Python では何でもオブジェクトであるように、Dict はオブジェクトです。ただし、objects 属性と dicts キーには違いがあります。dict はそのキーを属性として保存しません! dicts キーにアクセスする唯一の方法は、__getitem__メソッドまたは[]演算子を使用することです。

この方法でアイテムにアクセスしたい場合は、メソッドをオーバーライドして、代わりに結果を__getattr__返すようにすることができます。__getitem__

次のようなものを作成することもできます。

   class ObjectDict(dict):
       def __init__(self, *args, **kws):
           super(ObjectDict, self).__init__(*args, **kws)
           self.__dict__ = self

これにより、次の動作が発生します。

>>> d = ObjectDict()
>>> d['a'] = 3
>>>だ
3
>>> hasattr(d, 'a')
真実

しかし、これは Python でメモリ リークを引き起こすことが知られています。

于 2013-07-20T10:28:50.397 に答える