序列是支援 + 和 * 操作的。通常 + 號兩側的序列由 相同型別的資料所構成,在拼接的過程中,兩個被操作的序列都不會被 修改,python 會新建乙個包含同樣型別資料的序列來作為拼接的結果。 如果想要把乙個序列複製幾份然後再拼接起來,更快捷的做法是把這個 序列乘以乙個整數。同樣,這個操作會產生乙個新序列:
demo1
in [1]: l = [1,2,3,4,5]in [2]: l = [1,2,3,4,5] * 3in [3]: l
out[3]: [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
in [4]: '
abc' * 5out[4]: '
abcabcabcabcabc
'
+ 和 * 都遵循這個規律,不修改原有的操作物件,而是構建乙個全新的序列。
如果在 a * n 這個語句中,序列 a 裡的元素是對其他可變 物件的引用的話,你就需要格外注意了,因為這個式子的結果可能 會出乎意料。
比如,你想用 my_list = * 3 來初始化乙個 由列表組成的列表,但是你得到的列表裡包含的 3 個元素其實是 3 個引用,而且這 3 個引用指向的都是同乙個列表。這可能不是你想要的效果。
demo2
in [16]: board = [['_'] * 3 for i in range(3)] #1
in [17]: board
out[17]: [['
_', '
_', '
_'], ['
_', '
_', '
_'], ['
_', '
_', '_'
]]in [18]: board[1][2] = '
x' #2
in [19]: board
out[19]: [['
_', '
_', '
_'], ['
_', '
_', '
x'], ['
_', '
_', '
_']]
建立乙個包含 3 個列表的列表,被包含的 3 個列表各自有 3 個元 素。列印出這個巢狀列表。
把第 1 行第 2 列的元素標記為 x,再列印出這個列表。
得到了我們期望的結果
下面看demo3的方法,看似捷徑,卻是錯誤的:
demo3
in [25]: weied_board = [['_'] * 3] * 3 #1in [26]: weied_board
out[26]: [['
_', '
_', '
_'], ['
_', '
_', '
_'], ['
_', '
_', '_'
]]in [27]: weied_board[1][2] = '
x' #2
in [28]: weied_board
out[28]: [['
_', '
_', '
x'], ['
_', '
_', '
x'], ['
_', '
_', '
x']]
外面的列表其實包含 3 個指向同乙個列表的引用。當我們不做修改 的時候,看起來都還好。
一旦我們試圖標記第 1 行第 2 列的元素,就立馬暴露了列表內的 3 個引用指向同乙個物件的事實。
含有 3 個指向同一物件的引用的列表是毫無用處的
demo3犯的錯誤本質上跟下面demo4的**犯的錯誤一樣:
row=['_'] * 3board =
for i in range(3):
追加同乙個行物件(row)3 次到遊戲板(board)
相反,正確的寫法如下:
in [1]: board =in [2]: for i in range(3):
...: row = ['
_ ...:
in [3]: board
out[3]: [['
_', '
_', '
_'], ['
_', '
_', '
_'], ['
_', '
_', '_'
]]in [4]: board[1][2] = 'x'
in [5]: board #2
out[5]: [['
_', '
_', '
_'], ['
_', '
_', '
x'], ['
_', '
_', '
_']]
每次迭代中都新建了乙個列表,作為新的一行(row)追加到遊戲板 (board)。
正如我們所期待的,只有第 2 行的元素被修改。
這裡涉及到引用可變物件的原理陷進,下次我們再說
MySQL 序列使用
mysql序列是一組整數 1,2,3,由於一張資料表只能有乙個欄位自增主鍵,如果你想實現其他欄位也實現自動增加,就可以使用mysql序列來實現。本章我們將介紹如何使用mysql的序列。mysql中最簡單使用序列的方法就是使用 mysql auto increment 來定義列。以下例項中建立了資料表...
MySQL序列使用
mysql序列是一組整數 1,2,3,由於一張資料表只能有乙個欄位自增主鍵,如果你想實現其他欄位也實現自動增加,就可以使用mysql序列來實現。本章我們將介紹如何使用mysql的序列。使用auto increment mysql中最簡單使用序列的方法就是使用 mysql auto increment...
mysql 序列 MySQL 序列使用
mysql 序列使用 mysql 序列是一組整數 1,2,3,由於一張資料表只能有乙個欄位自增主鍵,如果你想實現其他欄位也實現自動增加,就可以使用mysql序列來實現。本章我們將介紹如何使用mysql的序列。使用 auto increment mysql 中最簡單使用序列的方法就是使用 mysql ...