Python list添加元素的方法及區別


前面章節介紹了很多關於 list 列表的操作函數,細心的讀者可能會發現,有很多操作函數的功能非常相似。例如,增加元素功能的函數有 append() 和 extend(),刪除元素功能的有 clear()、 remove()、pop() 和 del 關鍵字。

本節將通過實例演示的方式來明確各個函數的用法,以及某些函數之間的區別和在使用時的一些注意事項。

Python list添加元素的方法及區別

定義兩個列表(分別是 list1 和 list3),並分別使用 +、extend()、append() 對這兩個 list 進行操作,其操作的結果賦值給 l2。實例代碼如下:https://www.furuihua.cn/shenzhen/shajing/

  1. tt = 'hello'
  2. #定義一個包含多個類型的 list
  3. list1 = [1,4,tt,3.4,"yes",[1,2]]
  4. print(list1,id(list1))
  5. print("1.----------------")
  6. #比較 list 中添加元素的幾種方法的用法和區別
  7. list3 = [6,7]
  8. l2 = list1 + list3
  9. print(l2,id(l2))
  10. print("2.----------------")
  11. l2 = list1.extend(list3)
  12. print(l2,id(l2))
  13. print(list1,id(list1))
  14. print("3.----------------")
  15. l2 = list1.append(list3)
  16. print(l2,id(l2))
  17. print(list1,id(list1))

輸出結果為:

[1, 4, 'hello', 3.4, 'yes', [1, 2]] 2251638471496
1.----------------
[1, 4, 'hello', 3.4, 'yes', [1, 2], 6, 7] 2251645237064
2.----------------
None 1792287952
[1, 4, 'hello', 3.4, 'yes', [1, 2], 6, 7] 2251638471496
3.----------------
None 1792287952
[1, 4, 'hello', 3.4, 'yes', [1, 2], 6, 7, [6, 7]] 2251638471496

根據輸出結果,可以分析出以下幾個結論:

  1. 使用“+”號連接的列表,是將 list3 中的元素放在 list 的后面得到的 l2。並且 l2 的內存地址值與 list1 並不一樣,這表明 l2 是一個重新生成的列表。
  2. 使用 extend 處理后得到的 l2 是 none。表明 extend 沒有返回值,並不能使用鏈式表達式。即 extend 千萬不能放在等式的右側,這是編程時常犯的錯誤,一定要引起注意。
  3. extend 處理之后, list1 的內容與使用“+”號生成的 l2 是一樣的。但 list1 的地址在操作前后並沒有變化,這表明 extend 的處理僅僅是改變了 list1,而沒有重新創建一個 list。從這個角度來看,extend 的效率要高於“+”號。
  4. 從 append 的結果可以看出,append 的作用是將 list3 整體當成一個元素追加到 list1 后面,這與 extend 和“+”號的功能完全不同,這一點也需要注意。

Python list刪除操作

接下來演示有關 del 的基本用法,實例代碼如下:

  1. tt = 'hello'
  2. #定義一個包含多個類型的 list
  3. list1 = [1,4,tt,3.4,"yes",[1,2]]
  4. print(list1)
  5. del list1[2:5]
  6. print(list1)
  7. del list1[2]
  8. print(list1)

輸出結果為:

[1, 4, 'hello', 3.4, 'yes', [1, 2]]
[1, 4, [1, 2]]
[1, 4]

這 3 行輸出分別是 list1 的原始內容、刪除一部分切片內容、刪除指定索引內容。可以看到,del 關鍵字按照指定的位置刪掉了指定的內容。

需要注意的是,在使用 del 關鍵字時,一定要搞清楚,刪除的到底是變量還是數據。例如,下面代碼演示和刪除變量的方法:

  1. tt = 'hello'
  2. #定義一個包含多個類型的 list
  3. list1 = [1,4,tt,3.4,"yes",[1,2]]
  4. l2 = list1
  5. print(id(l2),id(list1))
  6. del list1
  7. print(l2)
  8. print(list1)

運行結果如下:

1765451922248 1765451922248
[1, 4, 'hello', 3.4, 'yes', [1, 2]]
Traceback (most recent call last):
  File "C:\Users\mengma\Desktop\demo.py", line 8, in <module>
    print(list1)
NameError: name 'list1' is not defined

第一行輸出的內容是 l2 和 list1 的地址,可以看到它們是相同的,說明 l2 和 list1 之間的賦值僅僅是傳遞內存地址。接下來將 list1 刪掉,並打印 l2,可以看到,l2 所指向的內存數據還是存在的,這表明 del 刪除 list1 時僅僅是銷毀了變量 list1,並沒有刪除指定的數據。

除了刪除變量,其他的刪除都是刪除數據,比如將列表中數據全部清空,實現代碼如下:

  1. tt = 'hello'
  2. #定義一個包含多個類型的 list
  3. list1 = [1,4,tt,3.4,"yes",[1,2]]
  4. l2 = list1
  5. l3 = l2
  6. del l2[:]
  7. print(l2)
  8. print(l3)

輸出結果為:

[]
[]

可以看到,l3 和 l2 執行同樣的內存地址,當 l2 被清空之后,l3 的內容也被清空了。這表明內存中的數據真正改變了。

另外,在實際過程中,即便使用 del 關鍵字刪除了指定變量,且該變量所占用的內存再沒有其他變量使用,此內存空間也不會真正地被系統回收並進行二次使用,它只是會被標記為無效內存。

如果想讓系統回收這些可用的內存,需要借助 gc 庫中的 collect() 函數。例如:

  1. #引入gc庫
  2. import gc
  3. tt = 'hello'
  4. #定義一個包含多個類型的 list
  5. list1 = [1,4,tt,3.4,"yes",[1,2]]
  6. del list1
  7. #回收內存地址
  8. gc.collect()

前面我們在《Python緩存機制》一節講過,系統為了提升性能,會將一部分變量駐留在內存中。這個機制對於,多線程並發時程序產生大量占用內存的變量無法得到釋放,或者某些不再需要使用的全局變量占用着大的內存,導致后續運行中出現內存不足的情況,此時就可以使用 del 關鍵字來回收內存,使系統的性能得以提升。同時,它可以為團隊省去擴充大量內存的成本。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM