换句话说就是
d = {}
d["key"] = len(d)
安全的Python?
我知道这是undefined behaviour in C++;在计算要分配给它的值之前,程序可能会获得对该元素的引用。这在Python中是相似的还是len(d)
总是在d.__getitem__("key")
之前计算?
答案 0 :(得分:7)
是的,在Python中它是安全的:表达式的评估顺序是从左到右,但在赋值语句中,在分配之前评估右侧发生。此外,算术表达式按其后缀的算术顺序进行评估。
Python从左到右评估表达式。请注意,虽然 评估一项任务,在评估之前对右侧进行评估 左手边。
在以下几行中,将对表达式进行求值 后缀的算术顺序:
答案 1 :(得分:1)
是的,任务的RHS在LHS之前进行评估;这是LHS是属性引用,订阅还是切片的情况。
来自https://docs.python.org/3/reference/simple_stmts.html#assignment-statements:
赋值语句计算表达式列表(请记住,这可以是单个表达式或以逗号分隔的列表,后者产生元组)并将单个结果对象从左到右分配给每个目标列表。
本节中的后续语言讨论了如何定义不同目标语法的赋值,但是从表达式列表已被评估以产生对象的角度来看这样做。
实际上,LHS中的评估顺序也是定义的;在下标之前评估容器:
- 如果目标是订阅:评估引用中的主表达式。它应该产生可变序列对象(例如列表)或映射对象(例如字典)。接下来,评估下标表达式。