pythonundefined-behavioroperator-precedence

Is the right-hand side of an assignment always evaluated before the assignment?


Here is a code snippet.

x = {}
x[1] = len(x)

print(x)
# {1: 0}

Is this well defined? That is, could x be {1: 1} instead?

Because I remember that an equivalent program in C++98 (if we use std::map) has undefined behaviour. The output of the program was different when compiled with VS compiler and G++.


Solution

  • The question is, is x[1] == 0, or is x[1] == 1?

    Let's look at the relevant documentation (2.x version):

    Python evaluates expressions from left to right. Notice that while evaluating an assignment, the right-hand side is evaluated before the left-hand side.

    In the following lines, expressions will be evaluated in the arithmetic order of their suffixes:

    ...
    expr3, expr4 = expr1, expr2
    

    Therefore len(x) will be fully computed before we do x[1], so x[1] == 0 and this is well defined.