在運(yùn)用python的過程中,發(fā)現(xiàn)當(dāng)函數(shù)參數(shù)為list的時候,在函數(shù)內(nèi)部調(diào)用list.append()會改變形參,與C/C++的不太一樣,查閱相關(guān)資料,在這里記錄一下。
python中id可以獲取對象的內(nèi)存地址
>>> num1 = 10 >>> num2 = num1 >>> num3 = 10 >>> id(num1) >>> id(num2) >>> id(num3)
可以看到num1、num2、num3三個對象指向的是一個地址,python在這里采用的是一種叫做引用計數(shù)的方式來完成的,很類似C++zhong的智能指針,變量賦值給變量相當(dāng)于同一對象引用計數(shù)器+1,而不是重新分配空間。
對于list對象可以看到下面的結(jié)果:
>>> list1 = [0,1] >>> list2 = [0,1] >>> id(list1) >>> id(list2) >>> list3 = list1 >>>id(list3)
list1與list3指向同一空間,list2指向另外的一處地址。
python中的函數(shù)傳參是對象傳遞,同時也存在局部與全局的問題,在傳參過程中存在兩個規(guī)則:
通過引用將參數(shù)復(fù)制到局部作用域的對象中,意味著被用來訪問函數(shù)參數(shù)的變量于提高給函數(shù)的對象無關(guān),因?yàn)榇嬖谝粋€復(fù)制問題,這和C語言是相同的。而且修改局部對象不會改變原始數(shù)據(jù)。
可以在適當(dāng)位置修改可變對象。可變對象主要就是列表和字典,這個適當(dāng)位置實(shí)質(zhì)上就是前面分析的局部子對象的修改不會改變字典對象或者列表對象的ID
def incrInt(num): pId(num) num += 1; pId(num) def incrList(listArg): pId(listArg) listArg.append(1); pId(listArg) def pId(arg): print id(arg) num1 = 10 pId(num1) incrInt(num1) print(num1) list1 = [0,2] pId(list1) incrList(list1) print(list1)
結(jié)果如下:
python test.py 4299181904 10 4336979912 [0, 2, 1]
可以看到在函數(shù)內(nèi)部,改變int的數(shù)值,則num指向了另一塊內(nèi)存地址,而修改list,則是在同一塊內(nèi)存地址。
在python中,對象可分為可變(mutable)和不可變(immutable)兩種類型,元組(tuple)、數(shù)值型(number)、字符串(string)均為不可變對象,而字典型(dictionary)和列表(list)的對象是可變對象。
所以在傳參過程中要注意下。
以上這篇老生常談python函數(shù)參數(shù)的區(qū)別(必看篇)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
