Index: Python/compile.c =================================================================== --- Python/compile.c (revision 88415) +++ Python/compile.c (working copy) @@ -3004,10 +3004,13 @@ n = asdl_seq_LEN(e->v.Dict.values); ADDOP_I(c, BUILD_MAP, (n>0xFFFF ? 0xFFFF : n)); for (i = 0; i < n; i++) { + /* Order is important keys must be evaluated before values, + per ref manual. */ VISIT(c, expr, + (expr_ty)asdl_seq_GET(e->v.Dict.keys, i)); + VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i)); - VISIT(c, expr, - (expr_ty)asdl_seq_GET(e->v.Dict.keys, i)); + ADDOP(c, ROT_TWO); ADDOP(c, STORE_MAP); } break; Index: Lib/test/test_compile.py =================================================================== --- Lib/test/test_compile.py (revision 88415) +++ Lib/test/test_compile.py (working copy) @@ -491,6 +491,14 @@ self.assertRaises(TypeError, compile, ast, '', 'exec') + def test_dict_compile_order(self): + self.i = 0 + def f(): + self.i += 1 + return self.i + d = {f(): f(), f(): f()} + self.assertEqual(d, {1: 2, 3: 4}) + def test_main(): test_support.run_unittest(TestSpecifics)