[筆記] Python Reference 與list的append特性

Alan Hsieh
Jul 20, 2022

--

在忙完碩論後總算有點時間回來寫medium,今天要寫的就是在做碩論的時候發現的事情,也算是做個筆記讓自己更熟悉,雖然之後工作也會用到Python但機會應該不多啦XD,那就開始正文吧。

第一個要講的是Reference,其實很久以前在寫Code時發現assign某些變數的時候不是用 Call By Value而是Call By Reference,但有時候除錯時沒想起來導致找了很久才發現,例如assign一個list又去修改它,發現原本的list也被修改了。

上面的程式碼就是Python中常見的Reference的案例,但下意識來說會理解為Call By Value,因此有時候在除錯會忽略這個地方。

上面程式碼第4行雖然有copy,但內部的list似乎還是使用Call By Reference形成的,因此對內部的list執行append依然會改動到原本的list哦!如果有興趣的話可以多找些文章或看官方文件,這篇不是技術文只是紀錄文QQ。

再來想講一下list的append其實是類似於C++中vector的push_back。
在用push_back等很容易能擴充陣列大小的方法時,有沒有想過它的複雜度是有可能會很高,或者是背後的實作原理哩。

vector在push_back主要是以2的指數倍預設它的上限,舉例來說當push_back後大於8的話就會自動找一塊大小為16的記憶體空間並把資料搬移過去(講的超簡略),因此push_back越多資料的話,到後期就有可能會越慢,且有可能浪費很多空間,而Python中的list也是類似的實作方式,如果能事先確定陣列大小的話是最好的了。

今天大概就到這裡了,這陣子還有點忙,大概還要再過陣子才會繼續更新C++ Primer重點整理之類的,不然就有可能先寫些別的XD。

--

--

Alan Hsieh

畢業於中正大學電機所,目前在IC設計公司擔任工程師,主要分享Code、工作相關與股票心得。Contact me: preposterous9797@gmail.com