Python列表的創(chuàng)建與刪除的操作指南
一、前言
列表(list)是 Python 中最常用、最靈活的內(nèi)置數(shù)據(jù)結(jié)構(gòu)之一。
它支持動(dòng)態(tài)擴(kuò)容、混合類(lèi)型、嵌套結(jié)構(gòu),幾乎無(wú)處不在。
但你真的會(huì)“創(chuàng)建”和“刪除”列表嗎?
- 空列表有幾種寫(xiě)法?哪種更快?
del、pop()、remove()有什么區(qū)別?- 刪除元素后,內(nèi)存真的釋放了嗎?
- 如何安全地清空一個(gè)被多個(gè)變量引用的列表?
本文將帶你: ? 掌握 6 種列表創(chuàng)建方式及適用場(chǎng)景
? 深入理解 4 種刪除操作的原理與差異
? 避開(kāi)“刪除后仍存在”的引用陷阱
? 學(xué)會(huì)高效清空與釋放內(nèi)存
? 寫(xiě)出安全、清晰、高性能的列表操作代碼
二、列表的創(chuàng)建方式
1. 字面量語(yǔ)法(最常用)
lst = [1, 2, 3] empty = []
? 優(yōu)點(diǎn):簡(jiǎn)潔、高效、可讀性強(qiáng)
? 推薦:90% 場(chǎng)景首選
2. 使用list()構(gòu)造器
lst = list([1, 2, 3]) # 從可迭代對(duì)象創(chuàng)建
empty = list() # 空列表
chars = list("hello") # ['h', 'e', 'l', 'l', 'o']? 適用:將字符串、元組、集合等轉(zhuǎn)為列表
注意:list() 比 [] 略慢(需函數(shù)調(diào)用開(kāi)銷(xiāo))
3. 列表推導(dǎo)式(List Comprehension)
squares = [x**2 for x in range(5)] # [0, 1, 4, 9, 16] evens = [x for x in range(10) if x % 2 == 0]
? 優(yōu)點(diǎn):簡(jiǎn)潔、高效、Pythonic
? 推薦:替代 for + append() 的首選
4. 重復(fù)操作符*
zeros = [0] * 5 # [0, 0, 0, 0, 0] rows = [[0] * 3] * 2 # ? 危險(xiǎn)!見(jiàn)下文陷阱
重大陷阱:[[0]*3]*2 會(huì)創(chuàng)建多個(gè)引用指向同一個(gè)子列表!
matrix = [[0] * 3] * 2 matrix[0][0] = 1 print(matrix) # [[1, 0, 0], [1, 0, 0]] ← 意外修改了兩行!
? 正確寫(xiě)法(用列表推導(dǎo)式):
matrix = [[0] * 3 for _ in range(2)]
5.copy()與deepcopy()(創(chuàng)建副本)
import copy original = [1, [2, 3]] shallow = original.copy() # 淺拷貝 deep = copy.deepcopy(original) # 深拷貝
? 用途:避免修改原列表(尤其含嵌套可變對(duì)象時(shí))
6. 動(dòng)態(tài)創(chuàng)建(空列表 +append/extend)
lst = []
for i in range(5):
lst.append(i)? 適用:無(wú)法預(yù)知元素?cái)?shù)量的場(chǎng)景
?? 性能:比列表推導(dǎo)式慢,盡量避免
三、列表的刪除操作詳解
| 方法 | 作用 | 返回值 | 是否就地修改 |
|---|---|---|---|
del lst[index] | 按索引刪除 | 無(wú) | ? 是 |
lst.pop(index) | 按索引刪除并返回值 | 被刪元素 | ? 是 |
lst.remove(value) | 按值刪除(首次匹配) | 無(wú) | ? 是 |
lst.clear() | 清空所有元素 | 無(wú) | ? 是 |
1.del:按索引或切片刪除
lst = [1, 2, 3, 4] del lst[1] # 刪除索引1 → [1, 3, 4] del lst[1:3] # 刪除切片 → [1] del lst # 刪除整個(gè)變量(不再指向列表)
del lst 不是清空列表,而是解除變量名與對(duì)象的綁定。
2.pop():刪除并獲取元素
lst = [10, 20, 30] last = lst.pop() # 返回 30,lst → [10, 20] first = lst.pop(0) # 返回 10,lst → [20]
? 典型應(yīng)用:實(shí)現(xiàn)棧(pop())或隊(duì)列(pop(0),但效率低)
pop(0) 時(shí)間復(fù)雜度 O(n),大數(shù)據(jù)量建議用 collections.deque
3.remove():按值刪除(只刪第一個(gè))
lst = [1, 2, 2, 3] lst.remove(2) # 刪除第一個(gè)2 → [1, 2, 3] lst.remove(99) # ValueError: list.remove(x): x not in list
? 建議:先判斷 if value in lst 再刪除,或捕獲異常
4.clear():清空列表(保留對(duì)象)
lst = [1, 2, 3] lst.clear() # lst → []
? 優(yōu)勢(shì):所有引用該列表的變量都會(huì)看到空列表
a = [1, 2, 3] b = a a.clear() print(b) # [] ← 因?yàn)?a 和 b 指向同一個(gè)對(duì)象
四、常見(jiàn)陷阱與避坑指南
陷阱 1:在遍歷中直接刪除元素(導(dǎo)致跳過(guò))
# 錯(cuò)誤!
nums = [1, 2, 3, 4, 5]
for x in nums:
if x % 2 == 0:
nums.remove(x) # 修改正在遍歷的列表 → 跳過(guò)元素!
# 結(jié)果:nums = [1, 3, 4, 5] ← 4 沒(méi)被刪!? 正確做法:
- 遍歷副本:
for x in nums[:]: - 或反向遍歷:
for i in range(len(nums)-1, -1, -1): - 或使用列表推導(dǎo)式:
nums = [x for x in nums if x % 2 != 0]
陷阱 2:誤以為del lst釋放了內(nèi)存
a = [1, 2, 3] b = a del a # 只刪除 a 這個(gè)名字,列表對(duì)象仍被 b 引用 print(b) # [1, 2, 3]
? 真正釋放內(nèi)存:當(dāng)所有引用都被刪除,Python 垃圾回收器才會(huì)回收對(duì)象。
陷阱 3:混淆lst = []與lst.clear()
def reset_list_bad(lst):
lst = [] # 只改變局部變量,不影響外部!
def reset_list_good(lst):
lst.clear() # 就地清空,外部可見(jiàn)? 如果需要讓函數(shù)修改傳入的列表,必須用 clear() 或切片賦值 lst[:] = []
五、性能對(duì)比(小貼士)
| 操作 | 時(shí)間復(fù)雜度 | 說(shuō)明 |
|---|---|---|
append() | O(1)(攤還) | 高效 |
pop()(末尾) | O(1) | 高效 |
pop(0) / insert(0, x) | O(n) | 低效,用 deque 替代 |
remove(x) | O(n) | 需線性查找 |
x in lst | O(n) | 大列表建議用 set |
clear() | O(n) | 需釋放每個(gè)元素的引用 |
六、最佳實(shí)踐總結(jié)
| 場(chǎng)景 | 推薦做法 |
|---|---|
| 創(chuàng)建空列表 | lst = [] |
| 從可迭代對(duì)象創(chuàng)建 | list(iterable) |
| 條件過(guò)濾生成 | 列表推導(dǎo)式 [x for x in ... if ...] |
| 安全刪除遍歷中元素 | 遍歷副本或用推導(dǎo)式 |
| 清空列表(多引用共享) | lst.clear() |
| 獲取并刪除末尾元素 | lst.pop() |
| 按值刪除(確保存在) | 先 if x in lst 再 remove |
核心原則:
“就地修改” vs “創(chuàng)建新對(duì)象”要分清,
引用關(guān)系決定你的刪除是否生效。
七、結(jié)語(yǔ)
以上就是Python列表的創(chuàng)建與刪除的操作指南的詳細(xì)內(nèi)容,更多關(guān)于Python列表創(chuàng)建與刪除的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python實(shí)現(xiàn)讀取Excel內(nèi)容并展示成json
這篇文章主要為大家詳細(xì)介紹了如何使用python實(shí)現(xiàn)讀取Excel內(nèi)容并展示成json功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下2023-12-12
用python畫(huà)了個(gè)圣誕樹(shù)給女朋友
大家好,本篇文章主要講的是用python畫(huà)了個(gè)圣誕樹(shù)給女朋友,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12
Python scipy的二維圖像卷積運(yùn)算與圖像模糊處理操作示例
這篇文章主要介紹了Python scipy的二維圖像卷積運(yùn)算與圖像模糊處理操作,涉及Python數(shù)學(xué)運(yùn)算與圖形繪制相關(guān)操作技巧,需要的朋友可以參考下2019-09-09
基于Python編寫(xiě)一個(gè)簡(jiǎn)單的電池提醒程序
上周,同事因?yàn)橥洺潆?筆記本電腦在重要會(huì)議中突然關(guān)機(jī),尷尬不已,所以本文我們就來(lái)使用Python編寫(xiě)一個(gè)簡(jiǎn)單的電池提醒程序,感興趣的小伙伴可以了解下2025-07-07

