說明
這一切都歸結爲正確理解evaluation order如何在這裏工作,特別是案例expr3, expr4 = expr1, expr2
。
如果我們通過聲明lol[lol.index("test")], lol[lol.index("test2")] = lol[lol.index("test2")], lol[lol.index("test")]
一步,我們會得到這樣的事情:
r1=evaluate(expr1) --> "test2"
r2=evaluate(expr2) --> "test"
evaluate(expr3)=r1 --> lol[0] = "test2" --> lol = ["test2","test2"]
evaluate(expr4)=r2 --> lol[0] = "test" --> lol = ["test", "test2"]
另一個片段是小事:
i1 = lol.index("test")
i2 = lol.index("test2")
lol[i1], lol[i2] = lol[i2], lol[i1]
it1) i1 = 0
it2) i2 = 1
it3) lol[i1], lol[i2] = "test2", lol[i1]
it4) lol[i1], lol[i2] = "test2", "test"
it5) lol[i1] = "test2"
it6) lol[i2] = "test"
Oneliner替代
喜歡的東西,這些應該這樣做:
個
lol = lol[lol.index("test2")], lol[lol.index("test")]
lol[0], lol[1] = lol[1], lol[0]
lol[0], lol[1] = lol[lol.index("test2")], lol[lol.index("test")]
aditional的筆記
如果你真的想知道更多關於如何將這些功能真的解釋,這樣做的一個很好的方法是使用模塊dis,例如:
>>> import dis
>>> def f():
... lst[lst.index(str1)], lst[lst.index(str2)] = lst[lst.index(str2)], lst[lst.index(str1)]
...
>>> dis.dis(f)
2 0 LOAD_GLOBAL 0 (lst)
3 LOAD_GLOBAL 0 (lst)
6 LOAD_ATTR 1 (index)
9 LOAD_GLOBAL 2 (str2)
12 CALL_FUNCTION 1
15 BINARY_SUBSCR
16 LOAD_GLOBAL 0 (lst)
19 LOAD_GLOBAL 0 (lst)
22 LOAD_ATTR 1 (index)
25 LOAD_GLOBAL 3 (str1)
28 CALL_FUNCTION 1
31 BINARY_SUBSCR
32 ROT_TWO
33 LOAD_GLOBAL 0 (lst)
36 LOAD_GLOBAL 0 (lst)
39 LOAD_ATTR 1 (index)
42 LOAD_GLOBAL 3 (str1)
45 CALL_FUNCTION 1
48 STORE_SUBSCR
49 LOAD_GLOBAL 0 (lst)
52 LOAD_GLOBAL 0 (lst)
55 LOAD_ATTR 1 (index)
58 LOAD_GLOBAL 2 (str2)
61 CALL_FUNCTION 1
64 STORE_SUBSCR
65 LOAD_CONST 0 (None)
68 RETURN_VALUE
>>>
來源
2017-09-20 15:02:40
BPL
這給人的錯誤印象是,在「A,B = C,D」的陳述中,評估順序是** 1。** A; ** 2。** B; ** 3。** C; ** 4。** A = C; ** 5。** D; ** 6。** B = D。雖然評估順序應該是** 1。** C; ** 2。** D; ** 3。** A; ** 4。** B; ** 5。** A = C; ** 6。** B = D – kaza