我偶然發現'x = [m] * n'並在解釋器中運行它,我可以看到代碼分配了一個用m初始化的n元素數組。但是我無法在線找到這種類型的代碼的描述。這個叫什麼?什麼是Python中的x = [m] * n語法?
>>> x = [0]*7
>>> x
[0, 0, 0, 0, 0, 0, 0]
我偶然發現'x = [m] * n'並在解釋器中運行它,我可以看到代碼分配了一個用m初始化的n元素數組。但是我無法在線找到這種類型的代碼的描述。這個叫什麼?什麼是Python中的x = [m] * n語法?
>>> x = [0]*7
>>> x
[0, 0, 0, 0, 0, 0, 0]
從the Python docs' description,整數n
和原始序列類型之間所使用的乘法運算符*
執行序列n
倍中的項目的順序重複。所以我想你正在尋找的術語是序列重複。請注意,這不是「序列複製」,因爲沒有創建項目的副本 - 您有n
引用了相同的序列。
希望我能接受兩個答案。謝謝你們倆。史蒂夫S –
只是一個筆記,我花了我的時間來學習,而寫y答案在這裏:*實際上沒有爲任何序列定義 - 它是爲內置序列類型(列表元組,字節,字節數組)定義的, ,但是不存在作爲「collections.abc.Sequence」的混合功能,其「事實上」定義了「序列協議」。 (在Python 2.x中,只是'collections.Sequence') – jsbueno
@jsbueno:這是因爲'collections.abc.Sequence'不能假定你的構造函數會像標準序列那樣需要一個可迭代的對象。 set也會出現同樣的問題,但是省略所有set操作符會給你一個集合不太重要的集合,所以他們咬緊牙關,用一個可以覆蓋的私有方法做出假設。 – Kevin
*
僅僅是一個乘法 - 爲+
的列表是一個直觀的事情,這意味着連擊兩個操作數,下一步是乘以一個標量 - 與[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]]
第二部分是關於此語法真正重要的部分。 – Jasper
[list repeat](https://github.com/python/cpython/blob/master/Objects/listobject.c#L506) – YOU
使用字符串 – inf