python函數(shù)傳值 python 傳值

python關(guān)于混合傳遞錯誤的是

基本原則

成都創(chuàng)新互聯(lián)公司,為您提供重慶網(wǎng)站建設(shè)公司網(wǎng)站制作、網(wǎng)站營銷推廣、網(wǎng)站開發(fā)設(shè)計,對服務(wù)高空作業(yè)車租賃等多個行業(yè)擁有豐富的網(wǎng)站建設(shè)及推廣經(jīng)驗。成都創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)公司成立于2013年,提供專業(yè)網(wǎng)站制作報價服務(wù),我們深知市場的競爭激烈,認(rèn)真對待每位客戶,為客戶提供賞心悅目的作品。 與客戶共同發(fā)展進(jìn)步,是我們永遠(yuǎn)的責(zé)任!

1、先按照參數(shù)的位置傳遞。

2、再按照參數(shù)的關(guān)鍵字傳遞。

3、最后按包裹的形式傳遞。注意定義函數(shù)時參數(shù)有默認(rèn)值,則帶有默認(rèn)值的參數(shù)必須跟在必選參數(shù)的后面。

實例

1

2

3

4

5

6

7

8

func(1,2) # 按位置傳遞方式將1、2賦值給a、b,c采用默認(rèn)值0

a=1 b=2 c=0 args = () kw = {}

func(1, 2, c=3) # 按位置傳遞方式將1、2賦值給a、b,將3賦值給c

a=1 b=2 c=3 args = () kw = {}

func(1, 2, 3, 'a', 'b')

a=1 b=2 c=3 args = ('a', 'b') kw = {}

func(1, 2, 3, 'a', 'b', x=99)

a=1 b=2 c=3 args = ('a', 'b') kw = {'x': 99}

以上就是python混合傳遞的基本原則,

Python 的函數(shù)是怎么傳遞參數(shù)的

對象vs變量

在python中,類型屬于對象,變量是沒有類型的,這正是python的語言特性,也是吸引著很多pythoner的一點。所有的變量都可以理解是內(nèi)存中一個對象的“引用”,或者,也可以看似c中void*的感覺。所以,希望大家在看到一個python變量的時候,把變量和真正的內(nèi)存對象分開。

類型是屬于對象的,而不是變量。

這樣,很多問題就容易思考了。

例如:

對象vs變量

12

nfoo = 1 #一個指向int數(shù)據(jù)類型的nfoo(再次提醒,nfoo沒有類型)lstFoo = [1] #一個指向list類型的lstFoo,這個list中包含一個整數(shù)1

可更改(mutable)與不可更改(immutable)對象

對應(yīng)于上一個概念,就必須引出另了另一概念,這就是可更改(mutable)對象與不可更改(immutable)對象。

對于python比較熟悉的人們都應(yīng)該了解這個事實,在python中,strings, tuples, 和numbers是不可更改的對象,而list,dict等則是可以修改的對象。那么,這些所謂的可改變和不可改變影響著什么呢?

可更改vs不可更改

12345

nfoo = 1nfoo = 2lstFoo = [1]lstFoo[0] = 2

代碼第2行中,內(nèi)存中原始的1對象因為不能改變,于是被“拋棄”,另nfoo指向一個新的int對象,其值為2

代碼第5行中,更改list中第一個元素的值,因為list是可改變的,所以,第一個元素變更為2。其實應(yīng)該說,lstFoo指向一個包含一個對象的數(shù)組。賦值所發(fā)生的事情,是有一個新int對象被指定給lstFoo所指向的數(shù)組對象的第一個元素,但是對于lstFoo本身來說,所指向的數(shù)組對象并沒有變化,只是數(shù)組對象的內(nèi)容發(fā)生變化了。這個看似void*的變量所指向的對象仍舊是剛剛的那個有一個int對象的list。

如下圖所示:

Python的函數(shù)參數(shù)傳遞:傳值?引用?

對于變量(與對象相對的概念),其實,python函數(shù)參數(shù)傳遞可以理解為就是變量傳值操作,用C++的方式理解,就是對void*賦值。如果這個變量的值不變,我們看似就是引用,如果這個變量的值改變,我們看著像是在賦值。有點暈是吧,我們?nèi)耘f據(jù)個例子。

不可變對象參數(shù)調(diào)用

12345

def ChangeInt( a ): a = 10nfoo = 2 ChangeInt(nfoo)print nfoo #結(jié)果是2

這時發(fā)生了什么,有一個int對象2,和指向它的變量nfoo,當(dāng)傳遞給ChangeInt的時候,按照傳值的方式,復(fù)制了變量nfoo的值,這樣,a就是nfoo指向同一個Int對象了,函數(shù)中a=10的時候,發(fā)生什么?(還記得我上面講到的那些概念么),int是不能更改的對象,于是,做了一個新的int對象,另a指向它(但是此時,被變量nfoo指向的對象,沒有發(fā)生變化),于是在外面的感覺就是函數(shù)沒有改變nfoo的值,看起來像C++中的傳值方式。

可變對象參數(shù)調(diào)用

12345

def ChangeList( a ): a[0] = 10lstFoo = [2]ChangeList(lstFoo )print nfoo #結(jié)果是[10]

當(dāng)傳遞給ChangeList的時候,變量仍舊按照“傳值”的方式,復(fù)制了變量lstFoo 的值,于是a和lstFoo 指向同一個對象,但是,list是可以改變的對象,對a[0]的操作,就是對lstFoo指向的對象的內(nèi)容的操作,于是,這時的a[0] = 10,就是更改了lstFoo 指向的對象的第一個元素,所以,再次輸出lstFoo 時,顯示[10],內(nèi)容被改變了,看起來,像C++中的按引用傳遞。

在python函數(shù)里,不用return,怎么把值送出來?

題主好. 如果不用 return, 我們可以選擇利用傳遞參數(shù)的引用來『把值送出來』, 但這樣只能針對不變對象, 如字典, 列表, numpy 數(shù)組等等. 例如我們可以用如下代碼修改 numpy 數(shù)組:

mat = numpy.zeros((3,3))

compute_matrix( mat )

我們可以定義函數(shù) compute_matrix 來修改參數(shù) mat 的值, 并在這個函數(shù)結(jié)束后返回, 可以不用 return.

附錄:

python 參數(shù)傳遞 (傳值或傳引用). 這篇博文將 python 中參數(shù)傳遞的情況, 什么時候傳值什么時候傳引用, 解釋地很清楚, 具體地:

如果函數(shù)收到的是一個可變對象(比如字典或者列表)的引用,就能修改對象的原始值--相當(dāng)于通過“傳引用”來傳遞對象。

如果函數(shù)收到的是一個不可變對象(比如數(shù)字、字符或者元組)的引用,就不能直接修改原始對象--相當(dāng)于通過“傳值'來傳遞對象。

python函數(shù)的參數(shù)傳遞是傳值還是傳引用

那要看數(shù)據(jù)類型了,int,float,str這種就是傳值,list,dict,類的實例,自定義對象都是穿引用。

下面是示例代碼:

def?change(int1,float1,str1,dict1,obj1,list1):

int1+=1

float1+=1

str1+='changed'

dict1['none_exist_key']='none_exist_value'

obj1=None

list1.append('change')

class?obj:

pass

int1=0

float1=0.0

str1='origin'

dict1={'key':'value'}

obj1=obj()

list1=['only_element']

print(int1)

print(float1)

print(str1)

print(dict1)

print(obj1)

print(list1)

change(int1,float1,str1,dict1,obj1,list1)

print('after?change')

print(int1)

print(float1)

print(str1)

print(dict1)

print(obj1)

print(list1)

不明白可追問

python函數(shù)傳參是傳值還是傳引用

python中所有數(shù)據(jù)都是對象,所以傳參也是傳的對象的引用,這個引用在函數(shù)執(zhí)行前和執(zhí)行后是不會被改變的,如:

num = 1

def change(num):

print(id(num))

num = 2

print(id(num))

執(zhí)行change(num)后num的值還是1

可以看到在執(zhí)行前num的id值(可以理解為內(nèi)存地址)是某一值

但在執(zhí)行change后,num的id值改變了,也就是說內(nèi)部的num指向了另外的對象,而外部的num卻還是指向原來的對象,所以值沒有變;

同理,如:

num_list = [1,2]

def change_list(num_list):

print(id(num_list))

num_list.append(3)

print(id(num_list))

可以看到執(zhí)行change_list后num_list的id值沒有改變,也就是說num_list是在原來的對象上添加了新的數(shù)據(jù),外部的num_list也是指向這一對象,所以外部的num_list數(shù)據(jù)也添加了新的數(shù)據(jù)。

分享標(biāo)題:python函數(shù)傳值 python 傳值
瀏覽路徑:http://www.muchs.cn/article32/docsjsc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、App設(shè)計品牌網(wǎng)站制作、微信小程序網(wǎng)頁設(shè)計公司、云服務(wù)器

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司