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 上的一行方塊。想要達成這些目的,最好的選擇是使
用列表推導:
另乙個方法看上去是個誘人的捷徑,但實際上它是錯的,含有3 個指向同一物件的引用的列表是毫無用處的:>>
> board =[[
'_']*3
for i in
range(3
)]>>
> board[[
'_',
'_',
'_'],[
'_',
'_',
'_'],[
'_',
'_',
'_']
]>>
> board[1]
[2]=
'x'>>
> board[[
'_',
'_',
'_'],[
'_',
'_',
'x'],[
'_',
'_',
'_']
]
序列的增量賦值:>>
> weird_board =[[
'_']*3
]*3>>
> weird_board[[
'_',
'_',
'_'],[
'_',
'_',
'_'],[
'_',
'_',
'_']
]>>
> weird_board[1]
[2]=
'o'>>
> weird_board[[
'_',
'_',
'o'],[
'_',
'_',
'o'],[
'_',
'_',
'o']
]
增量賦值運算子+= 和*= 的表現取決於它們的第乙個操作物件。簡單起見,我們把討論集
中在增量加法(+=)上,但是這些概念對*= 和其他增量運算子來說都是一樣的。
+= 背後的特殊方法是__iadd__(用於「就地加法」)。但是如果乙個類沒有實現這個方法的
話,python 會退一步呼叫__add__。考慮下面這個簡單的表示式:
如果a 實現了__iadd__ 方法, 就會呼叫這個方法。同時對可變序列( 例如list、>>
> a += b
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。
➍ 運用增量乘法後,新的元組被建立。
到底會發生下面4 種情況中的哪一種?>>
> t =(1
,2,[
30,40]
)>>
> t[2]
+=[50,
60]
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...