99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀Python語言中函數(shù)的參數(shù)傳遞機(jī)制
Python語言中函數(shù)的參數(shù)傳遞機(jī)制
2018-03-12
收藏

Python語言中函數(shù)的參數(shù)傳遞機(jī)制

python有兩種對象,immutable 和mutable,前者如number,string,tuple,后者如dictionary,list,下面先來看兩個例子。

例1:

>>> def func(a):
...     print('id of a before changed:',id(a))
...     a += 1
...     print('id of a after changed:',id(a))
... 
>>> a=1
>>> id(a)
29022864
>>> func(a)
('id of a before changed:', 29022864)
('id of a after changed:', 29022852)

>>> a,id(a)
(1, 29022864)

例2:

>>> def func(a):
...     print('id of a before changed:',id(a))
...     a.append(4)
...     print('id of a after changed:',id(a))
... 
>>> a = [1,2,3]
>>> id(a)
119580312
>>> func(a)
('id of a before changed:', 119580312)
('id of a after changed:', 119580312)
>>> a,id(a)
([1, 2, 3, 4], 119580312)

首先說明一點,python中的中所有數(shù)據(jù)都是object,object的有三個屬性,identity,type,value。identity即其id,可以認(rèn)為是其內(nèi)存地址,上面的例子中使用python的build-in函數(shù)id()來獲取其內(nèi)存地址。type表示其類型,該屬性決定了它的數(shù)據(jù)結(jié)構(gòu)和其支持的操作。value,則其含有的數(shù)據(jù)。

在解釋例子之前首先強(qiáng)調(diào)一點,python中,所有的參數(shù)傳遞都是pass by reference,即引用傳遞。

例1中代表了immutable類別的參數(shù)傳遞機(jī)制,傳遞的參數(shù)在函數(shù)返回后,是不會發(fā)生變化的。a是一個整型(可以通過type(a)來測試),即number類型,所以是immutable類別的??梢钥吹?,a在傳入函數(shù)處理以前,值為2,id為29022864,在傳入函數(shù)但未經(jīng)改變其值前,其id依然為29022864,所以驗證了python中的參數(shù)傳遞確實是引用傳遞,但在a的值通過自身的平方改變后,我們發(fā)現(xiàn),a 的id變?yōu)榱?9022852,即a這個名字已經(jīng)代表了另外一個內(nèi)存地址的對象。最后函數(shù)返回后,我們發(fā)現(xiàn)a的id依然是29022864,value也沒有發(fā)生變化。

例2代表了mutable類別的參數(shù)傳遞機(jī)制,傳遞的參數(shù)在函數(shù)中的改變,在函數(shù)返回后依然保留??梢钥吹剑琣所代表的對象的id,始終沒有發(fā)生變化,即value的改變是在全局的名字a所代表的對象上完成的。不同于例1中的例子,因為a所代表的id為29022864的對象,是immutable的,所以當(dāng)發(fā)生值改變時,函數(shù)內(nèi)部的名字a就指向了另一個id為29022852的對象,而當(dāng)函數(shù)返回后,全局的名字a所指向的id為29022864的值依然是2,沒有改變。

例3:

>>> def func(a):
...     print('id of a before changed:',id(a))
...     a = [1,2,3,4]
...     print('id of a after changed:',id(a))
... 
>>> a = [1,2,3]
>>> id(a)
119580312
>>> func(a)
('id of a before changed:', 119580312)
('id of a after changed:', 119580356)
>>> a,id(a)
([1, 2, 3], 119580312)

例3的結(jié)果,顯然與例2中我們的描述很不同。我們發(fā)現(xiàn),當(dāng)使用“a = [1,2,3,4]”對a所指代的對象進(jìn)行值改變后,a的id發(fā)生了變化。最后函數(shù)返回,全局的a代表的對象并沒有發(fā)生變化。其實問題出在python中“=”賦值操作上。統(tǒng)一的解釋是:如果mutable類型對象在函數(shù)中的改變不是由“=”來完成,那么該對象在函數(shù)中的改變在函數(shù)返回后依然保留。如果改變由“=”完成,則不保留。

下面給出一些例子來說明“=”在python的作用,進(jìn)而對上面的現(xiàn)象做一個統(tǒng)一的解釋。

例4:

>>> a =1
>>> b =a
>>> id(a),id(b)
(29022864, 29022864)
>>> b =2
>>> a,b
(1, 2)
>>> id(a),id(b)
(29022864, 29022852)

例5:

>>> a= [1,2,3]
>>> b =a
>>> id(a),id(b)
(119580232, 119580232)
>>> b.append(4)
>>> a,b
([1, 2, 3, 4], [1, 2, 3, 4])
>>> id(a),id(b)
(119580232, 119580232)

例6:

>>> a= [1,2,3]
>>> b= a
>>> id(a),id(b)
(79824096, 79824096)
>>> b = [1,2,3,4]
>>> a,b
([1, 2, 3], [1, 2, 3, 4])
>>> id(a),id(b)
(79824096, 119580232)

例4,例5和例6,其實是模仿了函數(shù)參數(shù)傳遞的過程,函數(shù)參數(shù)傳遞的過程,就是進(jìn)行類似"b=a"的操作,這里的b其實就相當(dāng)于例1,例2和例3中的函數(shù)里的“a”。在python中,b,a指向了同一個對象,即進(jìn)行“b=a”操作,若使用“=”操作改變b的值,python會直接新建一個對象,然后讓b指向它。所以a的值不發(fā)生變化。

至此,python里的函數(shù)參數(shù)傳遞原理應(yīng)該完整了。


數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時表示是新驗證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }