python學習10.04:Python list列表使用技巧及注意事項

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

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

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

定義兩個列表(分別是 list1 和 list3),並分別使用 +、extend()、append() 對這兩個 list 進行操做,其操做的結果賦值給 l2。實例代碼以下:python

tt = 'hello'
# 定義一個包含多個類型的 list
list1 = [1,4,tt,3.4,"yes",[1,2]]
print(list1,id(list1))

print("1.----------------")

# 比較 list 中添加元素的幾種方法的用法和區別
list3 = [6,7]
l2 = list1 + list3
print(l2,id(l2))

print("2.----------------")

# 效果等同於‘+’
l2 = list1.extend(list3)
print(l2,id(l2))
print(list1,id(list1))

print("3.----------------")

l2 = list1.append(list3)
print(l2,id(l2))
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 的基本用法,實例代碼以下:多線程

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

輸出結果爲:併發

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

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

須要注意的是,在使用 del 關鍵字時,必定要搞清楚,刪除的究竟是變量仍是數據。例如,下面代碼演示和刪除變量的方法:app

tt = 'hello'
# 定義一個包含多個類型的 list
list1 = [1,4,tt,3.4,"yes",[1,2]]
l2 = list1
print(id(l2),id(list1))
del list1
print(l2)
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,並無刪除指定的數據

除了刪除變量,其餘的刪除都是刪除數據,好比將列表中數據所有清空,實現代碼以下:性能

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

輸出結果爲:spa

[]
[]

能夠看到,l3 和 l2 執行一樣的內存地址,當 l2 被清空以後,l3 的內容也被清空了。這代表內存中的數據真正改變了。

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

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

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

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

相關文章
相關標籤/搜索