2016-05-15 29 views
9

我偶然發現'x = [m] * n'並在解釋器中運行它,我可以看到代碼分配了一個用m初始化的n元素數組。但是我無法在線找到這種類型的代碼的描述。這個叫什麼?什麼是Python中的x = [m] * n語法?

>>> x = [0]*7 
>>> x 
[0, 0, 0, 0, 0, 0, 0] 
+0

[list repeat](https://github.com/python/cpython/blob/master/Objects/listobject.c#L506) – YOU

+0

使用字符串 – inf

回答

12

the Python docs' description,整數n和原始序列類型之間所使用的乘法運算符*執行序列n倍中的項目的順序重複。所以我想你正在尋找的術語是序列重複。請注意,這不是「序列複製」,因爲沒有創建項目的副本 - 您有n引用了相同的序列。

+2

希望我能接受兩個答案。謝謝你們倆。史蒂夫S –

+1

只是一個筆記,我花了我的時間來學習,而寫y答案在這裏:*實際上沒有爲任何序列定義 - 它是爲內置序列類型(列表元組,字節,字節數組)定義的, ,但是不存在作爲「collections.abc.Sequence」的混合功能,其「事實上」定義了「序列協議」。 (在Python 2.x中,只是'collections.Sequence') – jsbueno

+1

@jsbueno:這是因爲'collections.abc.Sequence'不能假定你的構造函數會像標準序列那樣需要一個可迭代的對象。 set也會出現同樣的問題,但是省略所有set操作符會給你一個集合不太重要的集合,所以他們咬緊牙關,用一個可以覆蓋的私有方法做出假設。 – Kevin

17

*僅僅是一個乘法 - 爲+的列表是一個直觀的事情,這意味着連擊兩個操作數,下一步是乘以一個標量 - 與[0] * N意思是「與自己N次拼接這個列表」!

換句話說:*是Python中爲其基本序列類型定義的運算符,也是一個用於將序列與自身連接多少次的整數。它將與列表,元組甚至字符串一起工作。

這在Python中也有些自然,因爲語言允許運算符重載 - 所以Python程序員的確希望運算符能夠用對象做有意義的事情。

我們應該注意組成結果列表的對象不是原始列表中對象的副本 - 而是引用同一對象。因此,如果原始列表的內容只是數字或其他不可變對象,則不會有任何意外 - 但如果它包含可變對象(如內部列表),則在更改它們時可能會受到嚴重的副作用的影響 - 就像這樣片段:

In [167]: a = [[0]] * 7 

In [168]: a 
Out[168]: [[0], [0], [0], [0], [0], [0], [0]] 

In [169]: a[0].append(1) 

In [170]: a 
Out[170]: [[0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1]] 
+1

第二部分是關於此語法真正重要的部分。 – Jasper

相關問題