我最近剛剛在Python中遇到了這個很酷的黑客。
這就是:
d={}。
for i, d[i] in enumerate('abc')。
pass。
>>> d
{0: 'a'/span>, 1: 'b', 2: 'c'}。
>>>
這就把鍵值對從迭代器分配到一個空的字典中。
我想知道Cython后端是如何決議這個的,我的期望是,它被決議為解包賦值了。但我想知道Cython對此的實際實作,以及是否建議這樣做?
我知道我只是可以簡單地做:
d = {}。
for i, v in enumerate('abc') 。
d[i] = v
但是上面那個很酷的黑客可以用更短的代碼完成這個任務,但是我不確定它在Python中是否被認為是好的做法。
我從未見過有人使用這個方法...
uj5u.com熱心網友回復:
你不需要閱讀CPython代碼,因為這個行為已經在Python檔案中定義了。
如果你閱讀for 陳述句的檔案,for陳述句中的目標串列使用了標準賦值的規則:
每一個專案依次被分配到目標串列中,使用標準的 賦值的標準規則(見賦值陳述句)
而如果你閱讀賦值陳述句的規則,你可以看到賦值的目標串列中的每個專案都是按照從左到右的順序賦值的:
一個賦值陳述句對運算式串列進行評估(記住 這可以是一個單一的運算式,也可以是一個逗號分隔的串列,后者會產生一個元組。 產生一個元組),并將產生的單個物件分配給每個
所以在你的for回圈的第一次迭代中,產生了一個元組0, 'a':
for i, d[i] in enumerate('abc')
執行相當于以下的賦值陳述句:
i, d[i] = 0, 'a'/span>
這首先將0賦值給i,因為它在左邊,然后將'a'賦值給d[i],它被評估為d[0],實際上使d[0] = 'a'。
其余的迭代也是如此。
uj5u.com熱心網友回復:
@blhsing已經解釋了這是普通的從左到右的賦值。我有時也這樣做,也有類似的變化,我想補充一下why:
- 簡潔。即使你的額外變數只有一個字母,它也會稍微短一點。
- 速度。它避免了無意義的存盤和加載一個變數。
- 清潔性。不會因為一個無意義的變數而污染命名空間。
- 懶惰。不希望必須要考慮變數的名字。這很難. 。
- 教育。我喜歡指出人們不熟悉的東西:-) 。
- 娛樂。與上一點有關--我喜歡讓人們感到困惑:-D 。
因此,為了回答你的"推薦與否?"以及它是否"被認為是好的做法":我會說是的,我認為它完全沒有問題,甚至有好處。我認為唯一的潛在缺點是,有些人可能會抱怨它,純粹是因為他們不熟悉它,不喜歡不熟悉的東西。
關于速度方面的問題。正如下面的 dis.dis 所示,除了額外的變數 v 的 STORE 和 LOAD 之外,兩個版本都是一樣的。
dis.dis(''' | dis.dis(''/span>
d = {} | d = {}
for i, d[i] in enumerate('abc')。 | for i, v in enumerate('abc')。
pass | d[i] = v
'') | ''')
---------------------------------- -----------------------------------
0 BUILD_MAP 0 | 0 BUILD_MAP 0 ?
2 STORE_NAME 0 (d) | 2 STORE_NAME 0 (d)
4 LOAD_NAME 1 (enumerate) | 4 LOAD_NAME 1 (enumerate)
6 LOAD_CONST 0 ('abc') | 6 LOAD_CONST 0 ('abc')
8 CALL_FUNCTION 1 | 8 CALL_FUNCTION 1 ?
10 GET_ITER | 10 GET_ITER
12 FOR_ITER 12 (至26) | 12 FOR_ITER 16 (to 30)
14 UNPACK_SEQUENCE 2 | 14 UNPACK_SEQUENCE 2 >。
16 STORE_NAME 2 (i) ; 16 STORE_NAME 2 (i)
| 18 STORE_NAME 3 (v)
| 20 LOAD_NAME 3 (v)
18 LOAD_NAME 0 (d) | 22 LOAD_NAME0 (d)
20 LOAD_NAME 2 (i) | 24 LOAD_NAME2 (i)
22 STORE_SUBSCR | 26 STORE_SUBSCR
24 JUMP_ABSOLUTE 12 | 28 JUMP_ABSOLUTE 12 ?
26 LOAD_CONST 1 (None) | 30 LOAD_CONST 1 (None) number">30 LOAD_CONST 1 (None)
28 RETURN_VALUE | 32 RETURN_VALUE
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/328623.html
標籤:
上一篇:在Rails中使用塊優化IF子句
