【发布时间】:2017-08-18 11:44:52
【问题描述】:
我知道我可以通过这样做在 python dict 中添加一个新的键/值
some_dict['absent_key'] = somevalue
但我不太了解内部工作原理。
我曾经认为字典的行为类似于 C++ 地图。 [] 运算符将为给定键创建元素(如果它尚不存在),然后返回对它的引用,以便可以在与运算符 = 相同的行中为其分配一个值。
但是 C++ 中的这种行为会导致如果我们从映射中查询不存在的键的值,则为该键创建元素,并且将返回值类型的默认值而不是一个错误。在 python 中,这会抛出一个KeyError。
所以我不明白的是:如何,因为 [] 运算符也必须在 python 中的 = 之前进行评估(我认为?),它的行为是否会有所不同,具体取决于结果是否会被读取或分配一个值(在表达式评估的那一点它不应该知道)?
python 计算表达式的顺序有区别吗?或者解释器是否更聪明,因为字典具有硬编码类型,因此它更准确地知道它的行为,而 std::map 位于“库”中,因此编译器可以假设更少?还是其他原因?
【问题讨论】:
-
在 lhs 上,
[]映射到__setitem__(key, rhs),在 rhs 上[]映射到__getitem__(key)- 它们实现了不同的逻辑。在 C++ 中,[]是它自己的运算符,它返回一个可以更新的引用。在 python 中,=是一个语句,lhs不是C++中的表达式。 -
旁注:访问运算符
[]不是必需的:您可以使用dictionary.get(key, some_optional_default_value_if_key_not_found)。
标签: python dictionary operators