Python列表的創(chuàng)建與刪除的操作指南
一、前言
列表(list)是 Python 中最常用、最靈活的內置數據結構之一。
它支持動態(tài)擴容、混合類型、嵌套結構,幾乎無處不在。
但你真的會“創(chuàng)建”和“刪除”列表嗎?
- 空列表有幾種寫法?哪種更快?
del、pop()、remove()有什么區(qū)別?- 刪除元素后,內存真的釋放了嗎?
- 如何安全地清空一個被多個變量引用的列表?
本文將帶你: ? 掌握 6 種列表創(chuàng)建方式及適用場景
? 深入理解 4 種刪除操作的原理與差異
? 避開“刪除后仍存在”的引用陷阱
? 學會高效清空與釋放內存
? 寫出安全、清晰、高性能的列表操作代碼
二、列表的創(chuàng)建方式
1. 字面量語法(最常用)
lst = [1, 2, 3] empty = []
? 優(yōu)點:簡潔、高效、可讀性強
? 推薦:90% 場景首選
2. 使用list()構造器
lst = list([1, 2, 3]) # 從可迭代對象創(chuàng)建
empty = list() # 空列表
chars = list("hello") # ['h', 'e', 'l', 'l', 'o']? 適用:將字符串、元組、集合等轉為列表
注意:list() 比 [] 略慢(需函數調用開銷)
3. 列表推導式(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)點:簡潔、高效、Pythonic
? 推薦:替代 for + append() 的首選
4. 重復操作符*
zeros = [0] * 5 # [0, 0, 0, 0, 0] rows = [[0] * 3] * 2 # ? 危險!見下文陷阱
重大陷阱:[[0]*3]*2 會創(chuàng)建多個引用指向同一個子列表!
matrix = [[0] * 3] * 2 matrix[0][0] = 1 print(matrix) # [[1, 0, 0], [1, 0, 0]] ← 意外修改了兩行!
? 正確寫法(用列表推導式):
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) # 深拷貝
? 用途:避免修改原列表(尤其含嵌套可變對象時)
6. 動態(tài)創(chuàng)建(空列表 +append/extend)
lst = []
for i in range(5):
lst.append(i)? 適用:無法預知元素數量的場景
?? 性能:比列表推導式慢,盡量避免
三、列表的刪除操作詳解
| 方法 | 作用 | 返回值 | 是否就地修改 |
|---|---|---|---|
del lst[index] | 按索引刪除 | 無 | ? 是 |
lst.pop(index) | 按索引刪除并返回值 | 被刪元素 | ? 是 |
lst.remove(value) | 按值刪除(首次匹配) | 無 | ? 是 |
lst.clear() | 清空所有元素 | 無 | ? 是 |
1.del:按索引或切片刪除
lst = [1, 2, 3, 4] del lst[1] # 刪除索引1 → [1, 3, 4] del lst[1:3] # 刪除切片 → [1] del lst # 刪除整個變量(不再指向列表)
del lst 不是清空列表,而是解除變量名與對象的綁定。
2.pop():刪除并獲取元素
lst = [10, 20, 30] last = lst.pop() # 返回 30,lst → [10, 20] first = lst.pop(0) # 返回 10,lst → [20]
? 典型應用:實現棧(pop())或隊列(pop(0),但效率低)
pop(0) 時間復雜度 O(n),大數據量建議用 collections.deque
3.remove():按值刪除(只刪第一個)
lst = [1, 2, 2, 3] lst.remove(2) # 刪除第一個2 → [1, 2, 3] lst.remove(99) # ValueError: list.remove(x): x not in list
? 建議:先判斷 if value in lst 再刪除,或捕獲異常
4.clear():清空列表(保留對象)
lst = [1, 2, 3] lst.clear() # lst → []
? 優(yōu)勢:所有引用該列表的變量都會看到空列表
a = [1, 2, 3] b = a a.clear() print(b) # [] ← 因為 a 和 b 指向同一個對象
四、常見陷阱與避坑指南
陷阱 1:在遍歷中直接刪除元素(導致跳過)
# 錯誤!
nums = [1, 2, 3, 4, 5]
for x in nums:
if x % 2 == 0:
nums.remove(x) # 修改正在遍歷的列表 → 跳過元素!
# 結果:nums = [1, 3, 4, 5] ← 4 沒被刪!? 正確做法:
- 遍歷副本:
for x in nums[:]: - 或反向遍歷:
for i in range(len(nums)-1, -1, -1): - 或使用列表推導式:
nums = [x for x in nums if x % 2 != 0]
陷阱 2:誤以為del lst釋放了內存
a = [1, 2, 3] b = a del a # 只刪除 a 這個名字,列表對象仍被 b 引用 print(b) # [1, 2, 3]
? 真正釋放內存:當所有引用都被刪除,Python 垃圾回收器才會回收對象。
陷阱 3:混淆lst = []與lst.clear()
def reset_list_bad(lst):
lst = [] # 只改變局部變量,不影響外部!
def reset_list_good(lst):
lst.clear() # 就地清空,外部可見? 如果需要讓函數修改傳入的列表,必須用 clear() 或切片賦值 lst[:] = []
五、性能對比(小貼士)
| 操作 | 時間復雜度 | 說明 |
|---|---|---|
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) | 需釋放每個元素的引用 |
六、最佳實踐總結
| 場景 | 推薦做法 |
|---|---|
| 創(chuàng)建空列表 | lst = [] |
| 從可迭代對象創(chuàng)建 | list(iterable) |
| 條件過濾生成 | 列表推導式 [x for x in ... if ...] |
| 安全刪除遍歷中元素 | 遍歷副本或用推導式 |
| 清空列表(多引用共享) | lst.clear() |
| 獲取并刪除末尾元素 | lst.pop() |
| 按值刪除(確保存在) | 先 if x in lst 再 remove |
核心原則:
“就地修改” vs “創(chuàng)建新對象”要分清,
引用關系決定你的刪除是否生效。
七、結語
以上就是Python列表的創(chuàng)建與刪除的操作指南的詳細內容,更多關于Python列表創(chuàng)建與刪除的資料請關注腳本之家其它相關文章!
相關文章
Python scipy的二維圖像卷積運算與圖像模糊處理操作示例
這篇文章主要介紹了Python scipy的二維圖像卷積運算與圖像模糊處理操作,涉及Python數學運算與圖形繪制相關操作技巧,需要的朋友可以參考下2019-09-09

