Python學習筆記 序列賦值

2021-09-24 19:40:53 字數 3420 閱讀 5579

python 程式設計師會預設序列是支援+ 和* 操作的。通常+ 號兩側的序列由相同型別的資料所

構成,在拼接的過程中,兩個被操作的序列都不會被修改,python 會新建乙個包含同樣類

型資料的序列來作為拼接的結果。

如果想要把乙個序列複製幾份然後再拼接起來,更快捷的做法是把這個序列乘以乙個整

數。同樣,這個操作會產生乙個新序列:

>>

> l =[1

,2,3

]>>

> l *5[

1,2,

3,1,

2,3,

1,2,

3,1,

2,3,

1,2,

3]>>

>5*

'abcd'

'abcdabcdabcdabcdabcd'

+ 和* 都遵循這個規律,不修改原有的操作物件,而是構建乙個全新的序列。

有時我們會需要初始化乙個巢狀著幾個列表的列表,譬如乙個列表可能需要用來存放不同

的學生名單,或者是乙個井字遊戲板3 上的一行方塊。想要達成這些目的,最好的選擇是使

用列表推導:

>>

> board =[[

'_']*3

for i in

range(3

)]>>

> board[[

'_',

'_',

'_'],[

'_',

'_',

'_'],[

'_',

'_',

'_']

]>>

> board[1]

[2]=

'x'>>

> board[[

'_',

'_',

'_'],[

'_',

'_',

'x'],[

'_',

'_',

'_']

]

另乙個方法看上去是個誘人的捷徑,但實際上它是錯的,含有3 個指向同一物件的引用的列表是毫無用處的:

>>

> weird_board =[[

'_']*3

]*3>>

> weird_board[[

'_',

'_',

'_'],[

'_',

'_',

'_'],[

'_',

'_',

'_']

]>>

> weird_board[1]

[2]=

'o'>>

> weird_board[[

'_',

'_',

'o'],[

'_',

'_',

'o'],[

'_',

'_',

'o']

]

序列的增量賦值:

增量賦值運算子+= 和*= 的表現取決於它們的第乙個操作物件。簡單起見,我們把討論集

中在增量加法(+=)上,但是這些概念對*= 和其他增量運算子來說都是一樣的。

+= 背後的特殊方法是__iadd__(用於「就地加法」)。但是如果乙個類沒有實現這個方法的

話,python 會退一步呼叫__add__。考慮下面這個簡單的表示式:

>>

> a += b

如果a 實現了__iadd__ 方法, 就會呼叫這個方法。同時對可變序列( 例如list、

bytearray 和array.array)來說,a 會就地改動,就像呼叫了a.extend(b) 一樣。但是如

果a 沒有實現__iadd__ 的話,a += b 這個表示式的效果就變得跟a = a + b 一樣了:首先

計算a + b,得到乙個新的物件,然後賦值給a。也就是說,在這個表示式中,變數名會不

會被關聯到新的物件,完全取決於這個型別有沒有實現__iadd__ 這個方法。

總體來講,可變序列一般都實現了__iadd__ 方法,因此+= 是就地加法。而不可變序列根

本就不支援這個操作,對這個方法的實現也就無從談起。

>>

> l =[1

,2,3

]>>

>

id(l)

4311953800 ➊

>>

> l *=

2>>

> l[1

,2,3

,1,2

,3]>>

>

id(l)

4311953800 ➋

>>

> t =(1

,2,3

)>>

>

id(t)

4312681568 ➌

>>

> t *=

2>>

>

id(t)

4301348296 ➍

➊ 剛開始時列表的id。

➋ 運用增量乘法後,列表的id 沒變,新元素追加到列表上。

➌ 元組最開始的id。

➍ 運用增量乘法後,新的元組被建立。

乙個關於+=的謎題:

>>

> t =(1

,2,[

30,40]

)>>

> t[2]

+=[50,

60]

到底會發生下面4 種情況中的哪一種?

a. t 變成(1, 2, [30, 40, 50, 60])。

b. 因為tuple 不支援對它的元素賦值,所以會丟擲typeerror 異常。

c. 以上兩個都不是。

d. a 和b 都是對的。

答案是d

>>

> t =(1

,2,[

30,40]

)>>

> t[2]

+=[50,

60]traceback (most recent call last)

:file ""

, line 1,in

typeerror:

'tuple'

object does not support item assignment

>>

> t(1

,2,[

30,40,

50,60]

)

• 不要把可變物件放在元組裡面。

• 增量賦值不是乙個原子操作。我們剛才也看到了,它雖然丟擲了異常,但還是完成了操作。

參考:流暢的python

python序列學習筆記

序列均從0開始遞增 最後乙個元素的位置編號是 1 示例 分片 例如有這樣乙個序列arrs 1,2,3,4,5,6,7,8,9,10 訪問序列第8,9,10個元素,arrs 7 10 8,9,10 注意元素的標識是0 9,即從標識為7的元素開始 包含7 取到標識為10的元素 不包含10 簡單記作 7 ...

Python學習筆記 序列

1.序列 我們根據列表 元祖和字串的共同特點,把它們三統稱為序列。這三者有以下共同點 1 都可以通過索引得到每乙個元素 2 預設索引值總是從0開始 python還支援負數索引 3 可以通過分片的方法得到乙個範圍內的元素的集合 4 有很多共同的操作符 重複操作符 拼接操作符 成員關係操作符 2.迭代 ...

Python 學習筆記 序列

序列表示有序排列,並且可以通過下標偏移量訪問到它的乙個或幾個成員。字串 123 列表 0,123 元組 123 456 都屬於序列 定義乙個字串 序列 字串的值要用引號 sx 鼠牛虎兔龍蛇馬羊猴雞狗豬 為變數賦值 year 2018 為變數賦予整數進行計算 不需要引號 對變數進行計算 year 12...