標籤:字串 會同 under pre 改變 相等 根據 序列 新手學
疑惑在於 《python 程式設計(第2版) 董付國 清華大學出版社》第46頁
原文是:
【列表推導式】>>>freshfruit=[‘banana‘, ‘loganberry‘, ‘passion fruit‘]>>>aList=[w.strip() for w in freshfruit]等價於下面的代碼:>>>freshfruit=[‘banana‘, ‘loganberry‘, ‘passion fruit‘]>>>for i, v in enumerate(freshfruit): freshfruit[i]=v.strip()同時,也等價於>>>freshfruit=[‘banana‘, ‘loganberry‘, ‘passion fruit‘]>>>freshfruit=list(map(str.strip, freshfruit))
關鍵疑惑點在於最後一行代碼中的 map(str.strip, freshfruit)
根據上一條隨筆, map(A, B)函數是 把 B 代入 A 中 返回結果,按這個來看,那麼原文應該是 把列表 freshfruit 中的元素代入 str.strip 中,可是 str.strip 是什麼呢?!
先來看看這些代碼輸出的結果是什麼:
[‘banana‘, ‘loganberry‘, ‘passion fruit‘]
結果竟然與 原來的列表(freshfruit) 內容一樣
判斷 id(freshfruit) == id(aList) 答案是 False
故可知道這些代碼作用是 列表內容的複製,而不是記憶體位址的複製,即不是 ‘is’ 的關係,而是 ‘==’ 的關係。
到這裡就能明白 列表的複製 不能是 A = B 這麼簡單,因為這樣就是記憶體位址的相等,改變其中一個列表就會同樣對另一個列表進行改變。
比如說:
>>> oldlist = [‘a‘, ‘b‘, ‘c‘]>>> newlist = oldlist>>> oldlist[‘a‘, ‘b‘, ‘c‘]>>> newlist[‘a‘, ‘b‘, ‘c‘]>>> newlist.append(‘d‘)>>> newlist[‘a‘, ‘b‘, ‘c‘, ‘d‘]>>> oldlist[‘a‘, ‘b‘, ‘c‘, ‘d‘]
改變了 newlist 也會對 oldlist 進行改變。
>>> id(oldlist)1625304>>> id(newlist)1625304>>> newlist is newlistTrue
記憶體位址一樣。
那麼回到原來的疑惑, str.strip 到底是什嗎?
到這裡我才忽然明白了, 根據 strip()函數 的意思, Python strip() 方法用於移除字串頭尾指定的字元(預設為空白格或分行符號)或字元序列。——by 菜鳥教程
而書本上的那段代碼其實是這樣的:
>>>freshfruit=[‘ banana ‘, ‘ loganberry ‘, ‘passion fruit ‘]
在字元前後是加了幾個空格的,而不是像我最開始敲的代碼一樣沒有空格。
★這就解釋了其實書本上代碼的意思是 去除空格 ,而不是我以為的 列表內容的複製★
疑惑解決!
新手學python疑惑(一)—— 列表內容的複製