python函數參數傳遞機制_Python 學習筆記(一) 理解Python的函數傳參機制

對于剛接觸Python不久的新手,Python的函數傳參機制往往會讓人迷惑。學過C的同學都知道函數參數可以傳值或者傳地址。比如下面這段代碼

點擊(此處)折疊或打開

void func(int input) {

input = 100;

}

int a = 0;

func(a);

printf("%d", a);

結果應該是打印0,a的值自始至終都沒有改變,因為傳遞給函數func的是a變量的一個拷貝。而下面這段代碼,

點擊(此處)折疊或打開

void func(int* input) {

*input = 100;

}

int a = 0;

func(&a);

printf("%d", a);

則會打印100,因為傳遞給func的參數是變量a的地址。

那么Python遇到類似情況是怎么樣處理的呢?以下摘自Mark Lutz的Learning Python第五版,

Python’s pass-by-assignment scheme isn’t quite the same as C++’s reference parameters

option, but it turns out to be very similar to the argument-passing model of the C

language (and others) in practice:

Immutable arguments are effectively passed “by value.”Objects such as integers

and strings are passed by object reference instead of by copying, but because

you can’t change immutable objects in place anyhow, the effect is much like making

a copy.

Mutable arguments are effectively passed “by pointer.”Objects such as lists

and dictionaries are also passed by object reference, which is similar to the way C

passes arrays as pointers—mutable objects can be changed in place in the function,

much like C arrays.

Of course, if you’ve never used C, Python’s argument-passing mode will seem simpler

still—it involves just the assignment of objects to names, and it works the same whether

the objects are mutable or not.

也就是說在Python中,不可變參數(Immutable arguments)都是可理解為傳值的,而可變參數(Mutable arguments)都是可以理解為傳地址的。而哪些類型是不可變參數呢,根據Mark的描述,numbers,strings,tuples都屬于不可變,而list,dict都屬于可變類型。看下面這段小程序,

點擊(此處)折疊或打開

def func(var1):

var1 = 10

var2 = 200

func(var2)

print var2

func的傳入參數是整數,值為200,在func內部,它試圖把傳入參數賦值為10,結果打印出來的值仍然是200,原因是func的參數是不可變類型。

再看下面這段程序,

點擊(此處)折疊或打開

def func(var1):

var1[0] = 100

var2 = [3,4,5,6,7]

func(var2)

print var2[0]

func的傳入參數是list,屬于可變類型,而函數試圖把這個list的第一個元素用100進行賦值,結果是var2的第一元素從3變為了100,最終打印出來的結果是100。

在實際工作中,如何保證參數在傳遞過程中不發生改變呢?一個辦法是傳遞參數的一份拷貝,比如需要傳一個列表L = [1,2,3]給函數func,那你可以寫成func(L[:])。另一個辦法是使用函數tuple,把list轉換為tuple,像這樣func(tuple(L))。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/533941.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533941.shtml
英文地址,請注明出處:http://en.pswp.cn/news/533941.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

網頁無法調用java9_JAVA 9 (內部類,異常,包)

內部類:將一個類定義在另一個類里面,稱里面那個類為內部類。舉例:class Zx{public static void main(String []arr){Outer o new Outer();o.method();}}class Outer{class Inner //內部類,可以定義多個內部類{void function(){S…

python renamer模塊_Python - 批量文件重命名

兩個目標兩個:1. 輸入一組文件名,進行批量重命名;2. 輸入一組目錄名,批量重命名各個目錄下的文件。附加功能:1. 可根據文件的創建日期對文件重新排序;2. 重命名方式為遞增數列,可帶前后綴&#…

spark算子_Spark篇之持久化算子

一、前述Spark中控制算子也是懶執行的,需要Action算子觸發才能執行,主要是為了對數據進行緩存。控制算子有三種,cache,persist,checkpoint,以上算子都可以將RDD持久化,持久化的單位是partition。cache和persist都是懶執…

java g1 gc ref proc_深入理解垃圾收集器的G1及日志分析

盡管Hotspot 最新的垃圾回收器G1是在2006年推出的。但是G1從推行至今的市場反響來看,但現在足以證明這款垃圾收集器是經得起考驗的,從java9開始,就默認為G1垃圾收集器。G1是一款面向服務端應用的垃圾收集器。HotSpot開發團隊賦予它的使命是(在…

python爬取嗶哩嗶哩視頻_Python實現視頻爬取下載

注:源內容來自公眾號【python學習開發】一般情況下我們使用爬蟲更多的是對數據或者圖片進行爬取,今天在這里和大家分享一下關于使用爬蟲技術來進行視頻下載的方法,不僅可以方便的下載一些體積小的視頻,針對大容量的視頻下載同樣試用。接下來我們來介紹此次爬取視頻過…

java約瑟夫環pta上_cdoj525-猴子選大王 (約瑟夫環)

約瑟夫斯問題問題有時候也被描述成猴子選大王問題,題目如下.(最后會貼上約瑟夫問題的來歷) 一群猴子排成一圈,按1,2,…,n依次編號. 然后從第1只開始數,數到第m只,把它踢出圈,從它后面再開始數,再數到第m只,在把它踢出去…,如此不停的進行下去,直到最后只剩下一只猴子為止,那只猴…

java++記錄+運行_記錄java+testng運行selenium(三)---xml、ini、excel、日志等配置

一: ini文件ini目前只用處存儲瀏覽類型及需要打開的url,ini文件放在configs文件夾下面。讀取ini代碼如下:1 packagetoolskit.documents;23 import java.io.*;4 import java.util.*;56 /**7 * ClassName: ReadIni8 * Author: DingDong9 * D…

python字符串前面加f什么意思_Python 字符串前面加u,r,b,f的含義

1、字符串前加 u例:u"我是含有中文字符組成的字符串。"作用:后面字符串以 Unicode 格式 進行編碼,一般用在中文字符串前面,防止因為源碼儲存格式問題,導致再次使用時出現亂碼。2、字符串前加 r例&#xff1a…

mysql居左查詢abcd_MySql速查手冊

索引定義索引用來快速地尋找那些具有特定值的記錄,所有MySQL索引都以B樹的形式保存。就像是數據的目錄。索引類型唯一索引主鍵索引B-Tree普通索引R-Tree聯合索引Hash全文索引FullText在mysql中fulltext索引只針對myisam生效。符合索引對于創建的多列索引(復合索引)&…

和python哪個容易胖_為什么有些人特別容易胖?

7種人,最容易被肥胖盯上,其中有你嗎?胖,總是來得猝不及防,肥肉也總是不知不覺地長出來……許多胖友對自己的身材老摸不著腦,其實,長胖都是有跡可循的!正如下面這7類人,就…

loadrunner 錯誤: 無法找到 java.exe_LoadRunner錯誤及解決方法總結

1. error:missing newline in d:\loadrunner\name.dat場景執行時報error:missing newline in d:\loadrunner\name.dat第二次執行不報兩個解決辦法:第一:如果參數不是很多的話,不要打開記事本去編輯參數,就直接在LR提供的參數的表格…

gif透明背景動畫_【超實用干貨! 】iPad上的動畫App大推薦

作者/立夏編輯/彼方大家好,我是立夏。大概在兩年前吧我為大家寫過幾款動畫APP的評測,這一次我也想給大家推薦一些我的新寵,供大家參考。我在這里就不過多提及如Animation Desk、Procreate或是Callipeg之類知名度相對更高一些的動畫App了&…

python框架是干什么的_django框架是干什么的

django(Python Web 框架)Django是一個開放源代碼的Web應用框架,由Python寫成。采用了MTV的框架模式,即模型M,視圖V和模版T。它最初是被開發來用于管理勞倫斯出版集團旗下的一些以新聞內容為主的網站的,即是CMS(內容管理系統)軟件。…

iphone如何信任軟件_【手機軟件】千禾影院:全新觀影神器,支持安卓+iOS,最新、最全、高清、免費!...

Hello,大家好,我是春哥!每天記得打卡哦!感謝每一位小伙伴們的關注和支持!免責聲明大部分資源來源于網絡,僅供學習和交流使用,如有侵權請聯系我們刪除。每期文章末尾都會有關鍵詞,在公眾號發消息…

Java小魔女芭芭拉_沉迷蘑菇不可自拔,黏土人《小魔女學園》蘇西·曼芭芭拉 圖賞...

GOOD SMILE出品的黏土人系列手辦新作——《小魔女學園》蘇西曼芭芭拉,已經開始接受預定了。這款黏土人的原型師是來自中國上海的陳天,售價4167日元,預計2018年4月發售。蘇西是主人公亞可的室友,她是從東南亞來的身份不明的魔女。熱…

java int相除向上取整_java實戰項目常用類,Date、Calendar、BigDecimal、Math、UUID

Java開發中經常用到的類和方法,以下主要就日期是時間處理、金融數字處理、數學計算、隨機數、MD5加密等。java.util.Date類java.util 包提供了 Date 類來封裝當前的日期和時間。 Date 類提供兩個構造函數來實例化 Date 對象。日期時間的本質是一個long,它…

python四級中考有用的_一位中考生家長的后悔藥:考前30多天,千萬別做這7件傻事...

中考即將來臨,考后必定是幾家歡樂幾家愁,有慶幸的、有后悔的。中考前的幾個月到底應該怎么過?考前考中需要注意什么?家長做哪些事情是畫蛇添足的。今天給大家推薦一位“中考失敗”學子父親的自白,其中有對優秀兒子的心疼&#xf…

R語言中dim函數_R語言--向量化計算(apply族函數)

R語言最優秀的是它的向量化編程,這其中apply族函數扮演了非常重要的角色。apply族函數是由apply、sapply、lapply、mapply、tapply等函數組成的。熟練使用apply族函數,能夠簡化程序,提高代碼的運算速度。軟件&環境win10 64bitR 3.6.1appl…

php+mysql記事本_一個簡單記事本php操作mysql輔助類創建

//SqlHelper.class.phpconnmysql_connect($this->host,$this->user,$this->passwrd); if(!$this->conn){ die("連接失敗".mysql_error()); } mysql_select_db($this->db); mysql_query("set names utf8"); } //增刪改 function execute_dml…

python init方法做了什么_Python類方法、__new__方法和__init__方法分別是什么

Python類方法、__new__方法和__init__方法分別是什么發布時間:2020-09-03 15:24:06來源:億速云閱讀:104作者:小新這篇文章主要介紹Python類方法、__new__方法和__init__方法分別是什么,文中介紹的非常詳細,…