
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)
首先說明一點(diǎn),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)一點(diǎn),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,所以驗(yàn)證了python中的參數(shù)傳遞確實(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中的例子,因?yàn)閍所代表的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ā)生變化。其實(shí)問題出在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ù)參數(shù)傳遞的過程,就是進(jìn)行類似"b=a"的操作,這里的b其實(shí)就相當(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
SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實(shí)戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無論 ...
2025-09-18MySQL 大表拆分與關(guān)聯(lián)查詢效率:打破 “拆分必慢” 的認(rèn)知誤區(qū) 在 MySQL 數(shù)據(jù)庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實(shí)戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時,“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗(yàn)與 t 檢驗(yàn):差異、適用場景與實(shí)踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計(jì)學(xué)領(lǐng)域,假設(shè)檢驗(yàn)是驗(yàn)證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計(jì)劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計(jì)劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對象的 text 與 content:區(qū)別、場景與實(shí)踐指南 在 Python 進(jìn)行 HTTP 網(wǎng)絡(luò)請求開發(fā)時(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請求工具對比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長浮點(diǎn)數(shù)據(jù)的科學(xué)計(jì)數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長浮點(diǎn)數(shù)據(jù)時的科學(xué)計(jì)數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運(yùn)營問題、提升執(zhí)行效率的核心手段,其價值 ...
2025-09-12用 SQL 驗(yàn)證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實(shí)戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計(jì)” 與 “用戶體驗(yàn) ...
2025-09-11塔吉特百貨孕婦營銷案例:數(shù)據(jù)驅(qū)動下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當(dāng)下,精準(zhǔn)營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價值 在數(shù)據(jù)驅(qū)動決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實(shí)踐到業(yè)務(wù)價值挖掘 在數(shù)據(jù)分析場景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計(jì)模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價值導(dǎo)向 統(tǒng)計(jì)模型作為數(shù)據(jù)分析的核心工具,并非簡單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10