dict evaluation order
- ref:http://www.kt.rim.or.jp/~kbk/zakkicho/11/zakkicho1102b.html#D20110213-2
- ref:http://www.kt.rim.or.jp/~kbk/zakkicho/11/zakkicho1102b.html#D20110214-2
ふむ。
% python2.6 --version Python 2.6.1 % cat dict_test.py def f(): a, b = 1, 2 return { a: b } import dis dis.dis(f) % python2.6 dict_test.py 2 0 LOAD_CONST 3 ((1, 2)) 3 UNPACK_SEQUENCE 2 6 STORE_FAST 0 (a) 9 STORE_FAST 1 (b) 3 12 BUILD_MAP 1 15 LOAD_FAST 1 (b) 18 LOAD_FAST 0 (a) 21 STORE_MAP 22 RETURN_VALUE
ドキュメントとバイトコードから推測するに、STORE_MAP は
TOS2[TOS] = TOS1
という意味っぽい。(TOS がスタックトップ、TOS1、TOS2 が 2番目、3番目の要素)
と考えれば、value のほうを先に評価するほうが都合が良さそうだ。
Python 2.5 だとどうか。
% python2.5 --version Python 2.5.4 % python2.5 dict_test.py 2 0 LOAD_CONST 3 ((1, 2)) 3 UNPACK_SEQUENCE 2 6 STORE_FAST 0 (a) 9 STORE_FAST 1 (b) 3 12 BUILD_MAP 0 15 DUP_TOP 16 LOAD_FAST 1 (b) 19 ROT_TWO 20 LOAD_FAST 0 (a) 23 STORE_SUBSCR 24 RETURN_VALUE
こちらは専用命令はなく、通常の添え字によるアクセスと同様の命令。STORE_SUBSCR は
TOS1[TOS] = TOS2
なので、やはり value を先に評価するほうが都合が良いという。