對序列使用 和

2022-07-27 09:42:09 字數 2694 閱讀 9298

序列是支援 + 和 * 操作的。通常 + 號兩側的序列由 相同型別的資料所構成,在拼接的過程中,兩個被操作的序列都不會被 修改,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 ...