首頁 > 軟體

Python進階之利用+和*進行列表拼接

2023-12-20 14:00:32

引言

python作為一款深受大家喜愛的語言,一直都在時代的風口浪尖吸引了很多的人學習。在我們學習python的過程中,有一個非常常見的語法,那就是利用+和*進行序列的拼接以及其他操作。但是孰不住這個操作存在一個陷阱,今天就帶大家從使用+和*進行拼接出發認識一個大家非常容易犯的程式碼錯誤。話不多說我們開始吧。

對序列使用+和*

在編寫python的過程中,我們預設python的序列是支援+和*的操作的。例如在對序列相加的過程中,+號兩邊的序列需要是相同型別的序列,python會為我們建立一個相同型別的序列作為拼接的結果。請看下面這個例子:

string_01 = 'abc'
string_02 = 'def'

print(string_01 * 5)
print(string_01 + string_02)

>>>abcabcabcabcabc
>>>abcdef

另外,我們還可以在列表中使用上述程式碼進行拼接與合併,如下所示:

list_01 = [i for i in range(3)]
list_02 = [i for i in range(4,7)]

print(list_01 * 3)
print(list_01 + list_02)

>>>[0, 1, 2, 0, 1, 2, 0, 1, 2]
>>>[0, 1, 2, 4, 5, 6]

在這個過程當中,python不會修改原有的序列而是會新開闢一個空間儲存合併後或者拼接後的序列。

由列表組成的列表

在有些情況下,可能需要我們建立一個巢狀著幾個列表的列表,例如需要我們建立一個用於儲存員工資訊的巢狀列表。請看下面的程式碼:

worker_information = [['Nan'] * 3 for i in range(3)]
print(worker_information)

>>> [['Nan', 'Nan', 'Nan'], ['Nan', 'Nan', 'Nan'], ['Nan', 'Nan', 'Nan']]

注意:上述程式碼中利用了生成器表示式來完成,還不是很瞭解的小夥伴可以點選下方文章瞭解一下。 【python進階】你還在使用for迴圈新建陣列?生成器表示式幫你一行解決

當我們想要修改其中的一項時,只需要進行常規的賦值就可以了,如下所示:

worker_information[0][0] = '王剛'
worker_information[0][1] = '20歲'
print(worker_information)

>>>[['王剛', '20歲', 'Nan'], ['Nan', 'Nan', 'Nan'], ['Nan', 'Nan', 'Nan']]

巢狀列表建立的陷阱

我們通過上述程式碼中的+和的應用使得我們快速建立了巢狀列表。但是,要注意當使用諸如an的表示式時,a不能是同一個參照。下面我們來看一個具體的例子來更好的說明這種情況,請看下面這段程式碼:

worker_information_bug = [['Nan'] * 3] * 3
print(worker_information_bug)

worker_information_bug[0][0] = '王剛'
print(worker_information_bug)

>>>[['Nan', 'Nan', 'Nan'], ['Nan', 'Nan', 'Nan'], ['Nan', 'Nan', 'Nan']]
>>>[['王剛', 'Nan', 'Nan'], ['王剛', 'Nan', 'Nan'], ['王剛', 'Nan', 'Nan']]

程式出現了意想不到的結果,當我們改變巢狀列表中的一個元素時,所有列表的元素都發生了改變。下面這段程式碼也是典型的錯誤,如下:

row = ['Nan'] * 3
worker_information_bug_02 = []
for i in range(3):
    worker_information_bug_02.append(row)

print(worker_information_bug_02)

worker_information_bug_02[0][0] = '王剛'
print(worker_information_bug_02)

>>>[['Nan', 'Nan', 'Nan'], ['Nan', 'Nan', 'Nan'], ['Nan', 'Nan', 'Nan']]
>>>[['王剛', 'Nan', 'Nan'], ['王剛', 'Nan', 'Nan'], ['王剛', 'Nan', 'Nan']]

上述兩段程式碼的錯誤都是由於重複了同一個參照所導致的,在[['Nan'] * 3] 中我們建立了一個列表,但當這個結構被巢狀成[['Nan'] * 3] * 3時,其實我們只是在一個列表中放入了三個同一個列表的參照,而不是建立了三個列表。正確的做法應該如下:

worker_information_bug_02 = []
for i in range(3):
	# 每次迴圈都建立新的列表
    row = ['Nan'] * 3
    worker_information_bug_02.append(row)

print(worker_information_bug_02)

worker_information_bug_02[0][0] = '王剛'
print(worker_information_bug_02)

>>>[['Nan', 'Nan', 'Nan'], ['Nan', 'Nan', 'Nan'], ['Nan', 'Nan', 'Nan']]
>>>[['王剛', 'Nan', 'Nan'], ['Nan', 'Nan', 'Nan'], ['Nan', 'Nan', 'Nan']]

在上述程式碼中,我們在每次迴圈都建立了新的列表,這能夠保證我們的修改正常進行。

總結

在本文中,我們介紹了對列表使用+和*進行拼接以及在利用其不當的過程中,可能會導致的問題希望大家都能夠理解並注意。

到此這篇關於Python進階之利用+和*進行列表拼接的文章就介紹到這了,更多相關Python列表拼接內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com