真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯網站制作重慶分公司

python構造函數傳值 python函數構造及應用

python 給函數傳遞一個自定義的類的實例,是傳值還是傳址?

python不允許程序員選擇采用傳值還是傳引用。Python參數傳遞采用的肯定是“傳對象引用”的方式。這種方式相當于傳值和傳引用的一種綜合。如果函數收到的是一個可變對象(比如字典或者列表)的引用,就能修改對象的原始值--相當于通過“傳引用”來傳遞對象。如果函數收到的是一個不可變對象(比如數字、字符或者元組)的引用,就不能直接修改原始對象--相當于通過“傳值'來傳遞對象。

創(chuàng)新互聯公司堅持“要么做到,要么別承諾”的工作理念,服務領域包括:成都做網站、成都網站建設、企業(yè)官網、英文網站、手機端網站、網站推廣等服務,滿足客戶于互聯網時代的旌陽網站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯網解決方案。努力成為您成熟可靠的網絡建設合作伙伴!

原文來自:

python函數的參數傳遞是傳值還是傳引用

那要看數據類型了,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函數傳參是傳值還是傳引用

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

num = 1

def change(num):

print(id(num))

num = 2

print(id(num))

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

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

但在執(zhí)行change后,num的id值改變了,也就是說內部的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是在原來的對象上添加了新的數據,外部的num_list也是指向這一對象,所以外部的num_list數據也添加了新的數據。

python中視圖函數傳值的數據類型可以傳對象嗎

python的一切數據類型都是對象。但是python的對象分為不可變對象和可變對象。python的變量是引用,對python變量的賦值是引用去綁定該對象。

可變對象的數據發(fā)生改變,例如列表和字典,引用不會更改綁定對象,畢竟本身就是用于增刪改查的,頻繁地產生新對象必然導致開銷巨大,只需要該對象內部變化就行;但對于綁定了不可變對象的引用,對象一旦改變就會使引用綁定新的對象。

這一點也會反應到函數的參數上。python的傳值方式是“傳對象”引用。python的函數,形參實際上是引用,實參便是對象綁定到該引用上。本質是形參會被作為函數的局部變量,在開辟的函數的棧內存中被聲明。

簡要來講:

如果參數是數,則類似值傳遞,

如果參數是列表和字典,則類似引用傳遞。

每個對象都會有個id, 可以用id()驗證以上說法:

這個函數的參數是列表,是可變對象。

Python 的函數是怎么傳遞參數的

對象vs變量

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

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

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

例如:

對象vs變量

12

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

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

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

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

可更改vs不可更改

12345

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

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

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

如下圖所示:

Python的函數參數傳遞:傳值?引用?

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

不可變對象參數調用

12345

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

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

可變對象參數調用

12345

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

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

Python構造函數

類是對象的模板,是抽象的。

構造函數 init 是Python魔術方法之一,如圖魔術方法

我們通過類模版去創(chuàng)建類的實例對象,然后再調用類定義的功能。

那實例對象的屬性是通過什么來初始化的?

這時候Python引入來構造函數 init

構造函數,會在創(chuàng)建實例對象之后Python會自動執(zhí)行此方法,把初始化的屬性特點放到實例對象里。

通過前面的學習,我們知道一個python對象包含三個部分:id(識別碼),type(對象類型),value(對象的值)

那么我們進一步深入對象包含的三部分:

我們通過類創(chuàng)建實例對象后,需要定義構造函數 init ()方法。

構造方法用于執(zhí)行實例對象的初始化工作,即對象創(chuàng)建之后,初始化當前對象的相關的屬性,無返回值

構造函數重點 :

我們通過栗子來學習構造函數的過程

構造函數初始化實例對象過程如下:

1.Animal類會通過默認的 new ()方法為實例對象在堆內存中為開辟一個空間

敲黑板,重點來啦~

拓展:

我們今天學習了構造函數 init (),其在創(chuàng)建對象之后被Python自動調用初始化實例對象屬性數據值,無返回值,并且構造函數不能被顯示調用。

創(chuàng)建對象時,如果需要,構造函數可以接受參數。當創(chuàng)建沒有構造函數的類時,Python會自動創(chuàng)建一個不執(zhí)行任何操作的默認構造函數。

每個類必須有一個構造函數,即使它只依賴于默認構造函數

好啦,以上是本期內容,歡迎大佬評論區(qū)指正~


當前文章:python構造函數傳值 python函數構造及應用
瀏覽路徑:http://weahome.cn/article/dosccih.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部