python太調皮之 1 批量初始化list

2021-08-27 18:29:11 字數 2096 閱讀 5829

前言: 這個專題主要記錄一些在使用python過程中出現的一些自認為理所當然,但是實際情況與想象中差別很大的很神奇的狀況,python雖然好用,但也是個調皮的小孩,有時候也會對我們開個小小的玩笑,故取名為 「python太調皮」 系列。

如果想新建並初始化乙個全0的4行5列的list。可以有兩種方式:

1、利用for迴圈

a1 = [[0 for i in range(5)]for j in range(4)] 

print(a1)#輸出:[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

2、直接利用運算符號
a2 = [[0]*5]*4

print(a1)#輸出:[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

從輸出看,兩者的結果是相同的,接下來我們看看他們的維數:

n1 = len(a1)#輸出4

m1 = len(a1[0])#輸出5

n2 = len(a2)#輸出4

m2 = len(a2[0])#輸出5

a1[0][2] = 1 

print('a1:',a1)

a2[0][2] = 1

print('a2:',a2)

神奇的事情發生了,我們本意上只是想改變[0][2]這個位置上元素的值,但是第二種方法建立的list竟然把整個列都改變了:

a1:[[0, 0, 1, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

a2:[[0, 0, 1, 0, 0], [0, 0, 1, 0, 0], [0, 0, 1, 0, 0], [0, 0, 1, 0, 0]]

這種錯誤匪夷所思,通過其他方面完全看不出來,一般很難找到的。最後,經過網上查詢資料,發現了原因:第二種方法建立的[0] * 5是乙個一維陣列的物件,* 4之後只是把該物件的引用複製了4次,也就是說,我只要修改這個物件的乙個值,所有的引用都會跟著變化。

以後再建立list的時候,還是老老實實用for迴圈比較靠譜。前期圖乙個小小的省事最後導致消耗大量的精力去解決bug。

附:另乙個手殘操作:

在乙個做筆試的時候,還剩一分鐘就提交了,對於乙個list = [0.1,0.2,0.3,0.4]。想得到每個元素都乘以10的list,即list = [1,2,3,4]。於是手殘寫了這樣一句**:list = [0.1,0.2,0.3,0.4]*10時間緊迫,根本沒有辦法找出錯誤,最終也沒有正確提交上去(其實事後想起來,是一不小心「借鑑」了python中numpy包的廣播機制)。

其實這個真正執行的結果只是將這個list複製了10次,變成了:

list = [0.1,0.2,0.3,0.4,0.1,0.2,0.3,0.4,0.1,0.2,0.3,0.4,0.1,0.2,0.3,0.4,0.1,0.2,0.3,0.4,0.1,0.2,0.3,0.4,0.1,0.2,0.3,0.4,0.1,0.2,0.3,0.4,0.1,0.2,0.3,0.4,0.1,0.2,0.3,0.4]
對於這種操作list中對應元素的方法,python裡只能使用以下兩種方法:

map()函式

list = map(lambda x :x*10,list)

def chage(x) :            # 計算平方數

return x * 10

map(chage, list) # 計算列表各個元素的平方【注意這裡的函式不需要傳入引數,也不用括號】

但是需要注意,在python3中,這樣返回了乙個迭代器,並不是列表(如果接下來正好要使用for迴圈遍歷這個列表返回迭代器也挺方便的)

2. for迴圈

使用這種方式,給程式乙個列表,它會還你乙個列表,比較常用。

list = [lambda i: i*10 for i in list]

python3批量改名

自打有了網課的經驗,老師們各有個的收作業方式.有的用智學網.但有的老師就比較厲害,他們讓學生拍照傳檔案 甚至要改檔名,打包成zip 皿 既然是拍照上傳,拍照肯定是手機的事 我不會安卓,那我們看看在電腦上我們可以做什麼 改名字 用python實現應該不難 打包zip 應該也不難 發布 qq上發給特定的...

es之8 批量查詢mget 批量增刪改bulk

get mget 如果docs內的document都是同乙個index則可以簡略為 get ecommerce mget 如果docs內的document都是同乙個index同乙個type則可以進一步簡略為 get ecommerce product mget 1 bulk語法 post bulk ...

python實用指令碼2 批量重新命名檔案

前言 工作中經常有重新命名大量檔案的需求,因此可以考慮用程式來一鍵完成。這個功能比較簡單,可以多收集幾種版本來測試一下 python 使用os.listdir 方法返回當前目錄下的所有檔名,對每乙個檔名字串用str.replace 方法做替換操作,然後用os.rename 方法重新命名。import...