python中list在函數中清空
1.現象
1)在非函數傳參時
list = []
list.append('test')
list = []
可以發現,list确實指向了一個空list位址,這段代碼沒問題。
2)在函數傳參時
sqllist = []
sqllist.append('insert ......')
sqllist.append('.............')
def dealWithEnd(list):
lineNumber = ...
if lineNumber % BLOCK_SIZE == 0:
.....deal
ends[0] = 0
list[-1] = list[-1][:-1] #去掉最後的‘,’
exec_sql(' '.join(list))
list = []
list.append(sql1)
dealWithEnd(sqllist)
會發現,調用函數後sqllist之前的資料并沒有清空。
2.思考
思考運作過程:
-
1.當調用函數dealWithEnd(sqllist)時,系統會建立一個變量list,然後将sqllist指針的位址指派給list。
然後一系列的調用,eg:list.append(‘gg’),list[-1] = list[-1][:-1]等操作隻是通過list指針改變了其指向的記憶體的值,而sqllist也同樣指向這個位址,所有看到的是sqllist也發生了改變。
-
2.但随之運作list = [],将一個空list的指針位址指派給了list,list的發生了改變,但是sqllist還是指向原來的位址。
所有看到的函數調用完後,sqllist沒有按想象中清空。
忽然讓我想起了C語言。同c中相同,sqllist =[]相當于需要将一個空的List的指針指派給sqllist的指針,
改變的sqllist的指針的值,在c函數中需要通過指針的指針來改變,直接傳入sqllist的二級指針即可。
python也是如此,但是python好像沒有取指針的操作,是以隻能在不改變指針位址的情況下,删除該指針指向的位址的所有的資料eg :del list[:] 。
函數的傳參也一樣
在c中需要在函數中改變一個變量的值,需要傳入該值的指針
在python也是如此,在python中沒有指針,隻能傳入list等,通過list的指針改變list中的值。
總而言之:想要在函數中改變外面的變量值,必須通過指針來實作;如果變量本身是指針,那必須是指針的指針。
這對所有的語言都是通用,所有的語言的記憶體配置設定大同小異。隻是c中比較明确,而python中隐藏的比較深。
3.最終處理
python算是特殊途徑處理吧。對于作為函數參數的list,沒法擷取其指針的指針,
但可以在函數中釋放一個參數list所占記憶體: del lst_new[:] 或者 lst_new [:]=[],達到清空清單的目的,速度很快,也徹底。
sqllist = []
sqllist.append('insert ......')
sqllist.append('.............')
def dealWithEnd(list):
lineNumber = ...
if lineNumber % BLOCK_SIZE == 0:
.....deal
ends[0] = 0
list[-1] = list[-1][:-1] #去掉最後的‘,’
exec_sql(' '.join(list))
del list[:]
list.append(sql1)
dealWithEnd(sqllist)