Python 3の使用:
>>> a = []
>>> f = print(
a.append(1), a[:],
a.append(2), a[:],
a.append(3), a[:]
)
None [1] None [1, 2] None [1, 2, 3]
記録:
>>> a = []
>>> f = print(a.append(1), a, a.append(2), a, a.append(3), a)
不思議なことに(最初は)、このコードは次のように生成します。
None [1, 2, 3] None [1, 2, 3] None [1, 2, 3]
ただし、dis(f)
これはより明確になります。
>>> dis(f)
1 0 LOAD_NAME 0 (print) #Loads the value of 'print' into memory. Precisely, the value is pushed to the TOS (Top of Stack)
--> 3 LOAD_NAME 1 (a) #Loads the value of object 'a'
6 LOAD_ATTR 2 (append) #Loads the append attribute (in this case method)
9 LOAD_CONST 0 (1) #Loads the constant 1
12 CALL_FUNCTION 1 #a.append(1) is called
15 LOAD_NAME 1 (a) #for print(...,a,...)
18 LOAD_NAME 1 (a) #for the next a.append()
21 LOAD_ATTR 2 (append)
24 LOAD_CONST 1 (2)
27 CALL_FUNCTION 1 #a.append(2)
30 LOAD_NAME 1 (a)
33 LOAD_NAME 1 (a)
36 LOAD_ATTR 2 (append)
39 LOAD_CONST 2 (3)
42 CALL_FUNCTION 1 #a.append(3)
45 LOAD_NAME 1 (a) #loads a to be used thrice by print
48 CALL_FUNCTION 6 #calls print
51 PRINT_EXPR #prints TOS and clears it
52 LOAD_CONST 3 (None) #Loads None
55 RETURN_VALUE #Returns None
の出力dis(f)
は、私たちが期待したものです-L-to-R評価。基本的に、この「不一致」はprint()
最後に評価された結果です。それまでに、の値はa
に変更され[1, 2, 3]
、同じ最終オブジェクトが3回印刷されます。
に置き換えるa
とa[:]
、期待どおりの結果が得られます。