python作业是从右到左严格评估的吗?

时间:2015-04-20 16:28:48

标签: python operator-precedence

换句话说就是

d = {}
d["key"] = len(d)

安全的Python?

我知道这是undefined behaviour in C++;在计算要分配给它的值之前,程序可能会获得对该元素的引用。这在Python中是相似的还是len(d)总是在d.__getitem__("key")之前计算?

2 个答案:

答案 0 :(得分:7)

是的,在Python中它是安全的:表达式的评估顺序是从左到右,但在赋值语句中,在分配之前评估右侧发生。此外,算术表达式按其后缀的算术顺序进行评估。

5.14. Evaluation order

  

Python从左到右评估表达式。请注意,虽然   评估一项任务,在评估之前对右侧进行评估   左手边。

     

在以下几行中,将对表达式进行求值   后缀的算术顺序:

答案 1 :(得分:1)

是的,任务的RHS在LHS之前进行评估;这是LHS是属性引用,订阅还是切片的情况。

来自https://docs.python.org/3/reference/simple_stmts.html#assignment-statements

  

赋值语句计算表达式列表(请记住,这可以是单个表达式或以逗号分隔的列表,后者产生元组)并将单个结果对象从左到右分配给每个目标列表。

本节中的后续语言讨论了如何定义不同目标语法的赋值,但是从表达式列表已被评估以产生对象的角度来看这样做。

实际上,LHS中的评估顺序也是定义的;在下标之前评估容器:

  
      
  • 如果目标是订阅:评估引用中的主表达式。它应该产生可变序列对象(例如列表)或映射对象(例如字典)。接下来,评估下标表达式。
  •