python - Why does some_dict['key'] = somevalue work if the key is not in some_dict? -
i know can add new key/value in python dict doing
some_dict['absent_key'] = somevalue
but don't understand internals work.
i used think dictionaries behaved c++ maps. []
operator create element given key if not exist, return reference can assigned value in same line operator =
.
but behavior in c++ has consequence if query map value key not exist, element created key, , default value value type returned instead of error. in python, throws keyerror
.
so don't understand is: how, since []
operator must evaluated before =
in python (i think?), behave differently depending if result read or assigned value (which should not know @ point of expression evaluation)?
is there difference in order in python evaluates expressions? or interpreter smarter since dictionaries hare hardcoded type knows more precisely how behaves, while std::map in 'library' compiler can assume less? or other reason?
the operations:
some_dict[key]
and
some_dict[key] = value
and
del some_dict[key]
use different special methods of object: __getitem__
, __setitem__
, __delitem__
. it's not 1 operator ([]
) implements them all.
maybe example can illustrate that:
class something(dict): # subclassing dict def __getitem__(self, key): print('trying get', key) return super().__getitem__(key) def __setitem__(self, key, value): print('trying set', key, 'to', value) return super().__setitem__(key, value) def __delitem__(self, key): print('trying delete', key) return super().__delitem__(key)
test:
>>> s = something({'a': 1, 'b': 2}) >>> s['a'] trying 1 >>> s['c'] = 10 trying set c 10 >>> del s['b'] trying delete b
so depends on how implemented. in plain python dict
s __getitem__
returns value key or throws if it's not present.
but subclasses implement __missing__
method - in case want customize behavior if key wasn't present in dict (during lookup).
Comments
Post a Comment