亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python 類(lèi),對(duì)象,數(shù)據(jù)分類(lèi),函數(shù)參數(shù)傳遞詳解

 更新時(shí)間:2021年09月24日 15:52:14   作者:posted  
這篇文章主要介紹了深入理解Python 類(lèi),對(duì)象,數(shù)據(jù)分類(lèi),函數(shù)參數(shù)傳遞,涉及具體代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。

最近在基于python寫(xiě)的接口自動(dòng)化腳本,從Excel表中讀取所有數(shù)據(jù),每一行數(shù)據(jù)保存為字典,再將很多行的字典數(shù)據(jù)保存到一個(gè)列表里,運(yùn)行時(shí)發(fā)現(xiàn),列表中的字典均相同,且一直是excel最后一行的數(shù)據(jù),情況類(lèi)比如下:

dd = {"a":1,"b":10}
i = 2
list1 = []
while i< 5:
    dd["a"] = i
    i+=1
    list1.append(dd)
print("list1:{}".format(list1))

運(yùn)行結(jié)果如下圖,打印結(jié)果并不是預(yù)期的 list1:[{'b': 10, 'a': 2}, {'b': 10, 'a': 3}, {'b': 10, 'a': 4}] ,為什么呢??

在這里插入圖片描述

問(wèn)題的關(guān)鍵在于,數(shù)據(jù)分為可變及不可變類(lèi)型,python中字典是可變類(lèi)型,列表實(shí)際保存的是字典所指向的那片內(nèi)存,而這片內(nèi)存的內(nèi)容,保存的是最后一次修改的值?! ?/p>

為加深理解,重新溫故下python關(guān)于類(lèi)、對(duì)象、數(shù)據(jù)分類(lèi)、函數(shù)傳遞參數(shù)的相關(guān)知識(shí)。

1、基本概念

1.1 類(lèi)與對(duì)象的關(guān)系

對(duì)象:包含屬性(特征)和方法(行為)。例如,狗作為一個(gè)對(duì)象,有年齡、眼睛等特征,有走路、覓食等行為。

類(lèi):即把有相同屬性和方法的對(duì)象進(jìn)行提取(抽象化),是對(duì)象的模板。例如,對(duì)狗這個(gè)對(duì)象進(jìn)行抽象化,把具有覓食行為,具有年齡等相同特征的對(duì)象,抽象一個(gè)Animal類(lèi)。1.2 self的作用

class Animal():
    self.age = 0    #類(lèi)屬性
    def Eat(self):      #類(lèi)方法
        print ("覓食")
dog = Animal()   #類(lèi)的實(shí)例化,即對(duì)象
cat = Animal()   #類(lèi)的實(shí)例化,即對(duì)象
dog.Eat()   #相當(dāng)于Animal.Eat(dog)

在python里,當(dāng)對(duì)象調(diào)用類(lèi)中的方法時(shí),需要先把對(duì)象作為參數(shù)傳入方法中,相當(dāng)于告訴類(lèi),“老子來(lái)調(diào)用這個(gè)方法啦,留個(gè)名”。而對(duì)象把自己傳入方法,就是通過(guò)self?! ?/p>

如上圖,dog對(duì)象調(diào)用Eat(self)方法,執(zhí)行dog.Eat()時(shí),先用self接收dog對(duì)象,等同于執(zhí)行Animal.Eat(dog)?! ?/p>

正是因?yàn)閟elf參數(shù)接收的是對(duì)象本身,而self的英文翻譯就是“自己,自個(gè)”,所以大家都約定俗成的用了這個(gè)單詞,它并不是python的關(guān)鍵字,如果換成把self緩存that,here等,其實(shí)也一樣。

1.3 對(duì)象的創(chuàng)建與引用  

在python中,一切都是對(duì)象。對(duì)象均具備三個(gè)屬性:地址,類(lèi)型,值。  

當(dāng)"左邊 = 右邊"時(shí),實(shí)際是創(chuàng)建、引用對(duì)象的過(guò)程。  

如a = 3, 3實(shí)際上是一個(gè)對(duì)象,且對(duì)象的值為3,對(duì)象創(chuàng)建后存儲(chǔ)在內(nèi)存中,被a所引用。

在這里插入圖片描述

如果對(duì)象中的值可以更改,該值屬于可變類(lèi)型;  

如果對(duì)象中的值不能更改,該值屬于不可變類(lèi)型;  

如果對(duì)象中又包含對(duì)其他對(duì)象的引用,該對(duì)象就是容器,如d={},list1[0]=d,list1就是容器。

2、數(shù)據(jù)的分類(lèi)  

數(shù)據(jù)可變不可變,指的是存儲(chǔ)在內(nèi)存的內(nèi)容,即對(duì)象的值,是否可以被修改,分為倆大類(lèi):

  • 不可變類(lèi)型:例如整型,浮點(diǎn)型,字符串類(lèi)型;
  • 可變類(lèi)型:例如字典,列表。

2.1 不可變類(lèi)型  

不可變類(lèi)型,即對(duì)象本身的值不可以改變?! ?/p>

python在引用不可變類(lèi)型的對(duì)象時(shí),會(huì)尋找該對(duì)象是否創(chuàng)建過(guò),若該對(duì)象已創(chuàng)建,則變量會(huì)直接引用該對(duì)象,不會(huì)再申請(qǐng)新的內(nèi)存空間。

a = 3
b = 3
print(id(a))
print(id(b))
a = 4
print(id(a)) 
>> 502853488
>> 502853488
>> 502853520

3這個(gè)對(duì)象創(chuàng)建后,a、b都引用了它,所以打印出來(lái)的地址是相同的?! ?/p>

當(dāng)a = 4后,因?yàn)?屬于不可變類(lèi)型,因此又創(chuàng)建了一個(gè)4的對(duì)象,將a指向這個(gè)新創(chuàng)建的對(duì)象。

2.2 可變類(lèi)型  

可變類(lèi)型,即在對(duì)象本身的值允許改變,而內(nèi)存地址不需要改變,如 列表.append。  

python在引用不可變類(lèi)型的對(duì)象時(shí),會(huì)先申請(qǐng)新的內(nèi)存空間,來(lái)存儲(chǔ)這個(gè)對(duì)象,有別于不可變類(lèi)型。

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

a、b創(chuàng)建了倆個(gè)相同內(nèi)容的列表,但是其指向的內(nèi)存地址不相同。當(dāng)對(duì)a指向的可變對(duì)象增加元素后,a所引用的對(duì)象內(nèi)容已改變,但地址依舊不變。

3、函數(shù)傳遞參數(shù)的方式

3.1 值傳遞  

主函數(shù)向調(diào)用函數(shù)傳遞的參數(shù)是不可變類(lèi)型時(shí),實(shí)際上只是將實(shí)參的拷貝(即臨時(shí)副本)傳遞給了被調(diào)用函數(shù),并不是實(shí)參本身,這樣被調(diào)函數(shù)不能直接修改主調(diào)函數(shù)中變量的值,而只能修改其私有的臨時(shí)副本的值。

def ChangeList(list1):
    list1[1] = 5
li = [1,1,1]
print (li)
ChangeList(li)
print (li)
>> [1, 1, 1]
>> [1, 5, 1]

如代碼所示,s是字符串,屬于不可變類(lèi)型,傳遞給ChangeString(s)時(shí),是將s實(shí)際的值傳入,s本身不會(huì)被改變。

3.2 引用傳遞  

主函數(shù)向調(diào)用函數(shù)傳遞的參數(shù)是可變類(lèi)型時(shí),實(shí)際上是將實(shí)參的引用傳入了調(diào)用函數(shù),對(duì)引用的操作等于對(duì)其指定的對(duì)象進(jìn)行操作。

def ChangeList(list1):
    list1[1] = 5li = [1,1,1]
print (li)
ChangeList(li)
print (li)
>> [1, 1, 1]
>> [1, 5, 1]

如代碼所示,li是列表,屬于可變類(lèi)型,傳遞給ChangeList(list1)時(shí),list1也指向了li所引用的同一片內(nèi)存。

總結(jié)

1、類(lèi)是對(duì)象的抽象化,對(duì)象是類(lèi)的實(shí)例化,在python中一切都是對(duì)象?! ?/p>

2、self代表的是對(duì)象本身,將對(duì)象作為一個(gè)參數(shù)傳入方法中執(zhí)行?! ?/p>

3、內(nèi)存中的內(nèi)容按是否可以修改,分為可變類(lèi)型和不可變類(lèi)型,所對(duì)應(yīng)的可變對(duì)象和不可變對(duì)象,創(chuàng)建和引用方式也不同?! ?/p>

4、不可變類(lèi)型參數(shù)被函數(shù)調(diào)用時(shí),是值傳遞,可變類(lèi)型參數(shù)被函數(shù)調(diào)用時(shí),是引用傳遞。

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • python連接sql?server數(shù)據(jù)庫(kù)的方法實(shí)戰(zhàn)

    python連接sql?server數(shù)據(jù)庫(kù)的方法實(shí)戰(zhàn)

    當(dāng)我們用Python來(lái)編寫(xiě)網(wǎng)站,必須要能夠通過(guò)python操作數(shù)據(jù)庫(kù),下面這篇文章主要給大家介紹了關(guān)于python連接sql?server數(shù)據(jù)庫(kù)的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • Python列表推導(dǎo)式與生成器用法分析

    Python列表推導(dǎo)式與生成器用法分析

    這篇文章主要介紹了Python列表推導(dǎo)式與生成器用法,結(jié)合實(shí)例形式分析了列表推導(dǎo)式、生成器的原理、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2018-08-08
  • opencv鎖定鼠標(biāo)定位的實(shí)現(xiàn)

    opencv鎖定鼠標(biāo)定位的實(shí)現(xiàn)

    本文主要介紹了opencv鎖定鼠標(biāo)定位的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • python tkinter實(shí)現(xiàn)界面切換的示例代碼

    python tkinter實(shí)現(xiàn)界面切換的示例代碼

    今天小編就為大家分享一篇python tkinter實(shí)現(xiàn)界面切換的示例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • 淺談python數(shù)據(jù)結(jié)構(gòu)之動(dòng)態(tài)規(guī)劃

    淺談python數(shù)據(jù)結(jié)構(gòu)之動(dòng)態(tài)規(guī)劃

    這篇文章主要介紹了淺談python數(shù)據(jù)結(jié)構(gòu)之動(dòng)態(tài)規(guī)劃,可能很多小伙伴會(huì)覺(jué)得這個(gè)詞很陌生,覺(jué)得這是一種很復(fù)雜的思想,學(xué)習(xí)起來(lái)很困難,其實(shí)并不是這樣,動(dòng)態(tài)規(guī)劃所講述的知識(shí)與動(dòng)態(tài)與規(guī)劃并無(wú)太大關(guān)聯(lián),需要的朋友可以參考下
    2023-07-07
  • python中numpy.dot()計(jì)算矩陣相乘

    python中numpy.dot()計(jì)算矩陣相乘

    本文主要介紹了python中numpy.dot()計(jì)算矩陣相乘,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • python openpyxl篩選某些列的操作

    python openpyxl篩選某些列的操作

    這篇文章主要介紹了python openpyxl篩選某些列的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • Python讀取mat文件,并保存為pickle格式的方法

    Python讀取mat文件,并保存為pickle格式的方法

    今天小編就為大家分享一篇Python讀取mat文件,并保存為pickle格式的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • 詳細(xì)聊聊為什么Python中0.2+0.1不等于0.3

    詳細(xì)聊聊為什么Python中0.2+0.1不等于0.3

    最近在學(xué)習(xí)過(guò)程中發(fā)現(xiàn)在計(jì)算機(jī)JS時(shí)發(fā)現(xiàn)了一個(gè)非常有意思事,0.1+0.2的結(jié)果不是0.3,而是0.30000000000000004,下面這篇文章主要給大家介紹了關(guān)于為什么Python中0.2+0.1不等于0.3的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • Django與JS交互的示例代碼

    Django與JS交互的示例代碼

    本篇文章主要介紹了Django與JS交互的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08

最新評(píng)論