午夜国产狂喷潮在线观看|国产AⅤ精品一区二区久久|中文字幕AV中文字幕|国产看片高清在线

    從零學(xué)Python之引用和類屬性的初步理解
    來源:易賢網(wǎng) 閱讀:1152 次 日期:2014-05-19 20:19:02
    溫馨提示:易賢網(wǎng)小編為您整理了“從零學(xué)Python之引用和類屬性的初步理解”,方便廣大網(wǎng)友查閱!

    Python是一種解釋型、面向?qū)ο?、動態(tài)數(shù)據(jù)類型的高級程序設(shè)計(jì)語言。自從20世紀(jì)90年代初Python語言誕生至今,它逐漸被廣泛應(yīng)用于處理系統(tǒng)管理任務(wù)和Web編程。Python已經(jīng)成為最受歡迎的程序設(shè)計(jì)語言之一。2011年1月,它被TIOBE編程語言排行榜評為2010年度語言。自從2004年以后,python的使用率是呈線性增長。

    Python在設(shè)計(jì)上堅(jiān)持了清晰劃一的風(fēng)格,這使得Python成為一門易讀、易維護(hù),并且被大量用戶所歡迎的、用途廣泛的語言。

    鑒于以上各種優(yōu)點(diǎn),忍不住對Python進(jìn)行了一番學(xué)習(xí),略有收獲,分享給大家。

    最近對Python的對象引用機(jī)制稍微研究了一下,留下筆記,以供查閱。

    首先有一點(diǎn)是明確的:「Python中一切皆對象」。

    那么,這到底意味著什么呢?

    如下代碼:

    代碼如下:

    #!/usr/bin/envpython

    a=[0,1,2]#來個簡單的list

    #最初,list和其中各個元素的id是這樣的。

    print'origin'

    printid(a),a

    forxina:

    printid(x),x

    print'----------------------'

    #我們把第一個元素改改

    print'afterchangea[0]'

    a[0]=4

    printid(a),a

    forxina:

    printid(x),x

    print'----------------------'

    #我們再把第二個元素改改

    print'afterchangea[1]'

    a[1]=5

    printid(a),a

    forxina:

    printid(x),x

    print'----------------------'

    #回頭看看直接寫個0,id是多少

    print'howaboutconst0?'

    printid(0),0

    運(yùn)行結(jié)果如下:

    代碼如下:

    PastgiftMacbookPro:pythonpastgift$./refTest.py

    Origin

    [0,1,2]

    0

    1

    2

    ----------------------

    afterchangea[0]

    [4,1,2]

    4

    1

    2

    ----------------------

    afterchangea[1]

    [4,5,2]

    4

    5

    2

    ----------------------

    howaboutconst0?

    0

    從「Origin」部分來看,list中各個元素的地址之間都正好相差24,依次指向各自的數(shù)據(jù)——這讓我想到了數(shù)組。

    當(dāng)修改a[0]的值之后,發(fā)現(xiàn),a[0]的地址發(fā)生了變化。也就是說,賦值語句實(shí)際上只是讓a[0]重新指向另一個對象而已。此外,還注意到,a[0]的地址和a[2]的地址相差48(2個24)。

    當(dāng)再次修改a[1]之后,同樣地,a[1]的地址也發(fā)生變化,有趣的是,這次a[1]的地址和a[0]的地址又相差24,和原先的a[2]相差72(3個24)。

    最后,當(dāng)直接把數(shù)字0的地址打印出來后,發(fā)現(xiàn)它的地址和最開始的a[0]的地址完全一樣。

    至此,基本可以說明,就算是list中的元素,其實(shí)也是引用。修改list中的元素,實(shí)際上還是在修改引用而已。

    對于Python中類屬性,有人提到過「類屬性在同一類及其子類之間共享,修改類屬性會影響到同一類及其子類的所有對象」。

    聽著挺嚇人,但仔細(xì)研究之后,其實(shí)倒也不是什么大不了的事情。

    如下代碼:

    代碼如下:

    #!/usr/bin/envpython

    classBird(object):

    name='bird'

    talent=['fly']

    classChicken(Bird):

    pass

    bird=Bird();

    bird2=Bird();#同類實(shí)例

    chicken=Chicken();#子類實(shí)例

    #最開始是這樣的

    print'Originalattr'

    printid(bird.name),bird.name

    printid(bird.talent),bird.talent

    printid(bird2.name),bird2.name

    printid(bird2.talent),bird2.talent

    printid(chicken.name),chicken.name

    printid(chicken.talent),chicken.talent

    print'----------------------------'

    #換個名字看看

    bird.name='birdnamechanged!'

    print'afterchangingname'

    printid(bird.name),bird.name

    printid(bird.talent),bird.talent

    printid(bird2.name),bird2.name

    printid(bird2.talent),bird2.talent

    printid(chicken.name),chicken.name

    printid(chicken.talent),chicken.talent

    print'----------------------------'

    #洗個天賦試試(修改類屬性中的元素)

    bird.talent[0]='walk'

    print'afterchangingtalent(alist)'

    printid(bird.name),bird.name

    printid(bird.talent),bird.talent

    printid(bird2.name),bird2.name

    printid(bird2.talent),bird2.talent

    printid(chicken.name),chicken.name

    printid(chicken.talent),chicken.talent

    print'----------------------------'

    #換個新天賦樹(整個類屬性全換掉)

    bird.talent=['swim']

    print'afterreassigntalent'

    printid(bird.name),bird.name

    printid(bird.talent),bird.talent

    printid(bird2.name),bird2.name

    printid(bird2.talent),bird2.talent

    printid(chicken.name),chicken.name

    printid(chicken.talent),chicken.talent

    print'----------------------------'

    #洗掉新天賦樹(對新來的類屬性中的元素進(jìn)行修改)

    bird.talent[0]='dance'

    print'changingelementafterreassigningtalent'

    printid(bird.name),bird.name

    printid(bird.talent),bird.talent

    printid(bird2.name),bird2.name

    printid(bird2.talent),bird2.talent

    printid(chicken.name),chicken.name

    printid(chicken.talent),chicken.talent

    print'----------------------------'

    運(yùn)行結(jié)果:

    代碼如下:

    PastgiftMacbookPro:pythonpastgift$./changeAttributeTest.py

    Originalattr

    bird

    ['fly']

    bird

    ['fly']

    bird

    ['fly']

    ----------------------------

    afterchangingname

    birdnamechanged!

    ['fly']

    bird

    ['fly']

    bird

    ['fly']

    ----------------------------

    afterchangingtalent(alist)

    birdnamechanged!

    ['walk']

    bird

    ['walk']

    bird

    ['walk']

    ----------------------------

    afterreassigntalent

    birdnamechanged!

    ['swim']

    bird

    ['walk']

    bird

    ['walk']

    ----------------------------

    changingelementafterreassigningtalent

    birdnamechanged!

    ['dance']

    bird

    ['walk']

    bird

    ['walk']

    ----------------------------

    在「Origin」的時候,同類對象,子類對象的相同類屬性的地址都是相同的——這就是所謂的「共享」。

    修改name之后,只有被修改的對象name屬性發(fā)生變化。這是因?yàn)閷ame的賦值操作實(shí)際上就是換了一個字符串,重新引用。字符串本身并沒有發(fā)生變化。所以并沒有在同類和子類之間產(chǎn)生互相影響。

    接下來,修改talent中的元素。這時,情況有所改變:同類及其子類的talent屬性都一起跟著變了——這很好理解,因?yàn)樗鼈兌家玫膬?nèi)存地址都一樣,引用的是同一個對象。

    再接下來,給talent重新賦值,也就是改成引用另外一個對象。結(jié)果是只有本實(shí)例的talent屬性變化了。從內(nèi)存地址可以看出,本實(shí)例和其他實(shí)例的talent屬性已經(jīng)不再指向相同的對象了。就是說「至此,本實(shí)例已經(jīng)是圈外人士了」。

    那么,最后再次修改talent中元素后,對其他實(shí)例無影響的結(jié)果也是很好理解了。因?yàn)橐呀?jīng)是「圈外人士」了嘛,我再怎么折騰也都是自己的事情了。

    所以,「類屬性在同類及其子類之間互相影響」必須有一個前提條件:實(shí)例建立后,其類屬性從來沒有被重新賦值過,即類屬性依然指向最初所指向的內(nèi)存地址。

    最后提一下對象屬性

    如下代碼:

    代碼如下:

    #!/usr/bin/envpython

    classBird(object):

    def__init__(self):

    self.talent=['fly']

    bird=Bird()

    bird2=Bird()

    #剛開始的情形

    print'Origin'

    printid(bird.talent),bird.talent

    printid(bird2.talent),bird2.talent

    print'--------------------'

    #修改其中一個對象的屬性

    bird.talent[0]='walk'

    print'afterchangingattribute'

    printid(bird.talent),bird.talent

    printid(bird2.talent),bird2.talent

    print'--------------------'

    #作死:兩個對象的屬性指向同一個內(nèi)存地址,再修改

    bird.talent=bird2.talent

    bird.talent[0]='swim'

    print'assigntoanotherattributeandchangeit'

    printid(bird.talent),bird.talent

    printid(bird2.talent),bird2.talent

    print'--------------------'

    運(yùn)行結(jié)果:

    代碼如下:

    PastgiftMacbookPro:pythonpastgift$./changeAttributeTest2.py

    Origin

    ['fly']

    ['fly']

    --------------------

    afterchangingattribute

    ['walk']

    ['fly']

    --------------------

    assigntoanotherattributeandchangeit

    ['swim']

    ['swim']

    --------------------

    由于對象屬性就算內(nèi)容完全一樣(剛初始化后的屬性內(nèi)容一般都是一樣的),也會分配到完全不同的內(nèi)存地址上去。所以不存在「同類對象之間影響」的情況。

    但如果讓一個對象的屬性和另一個對象的屬性指向同一個地址,兩者之間(但也僅限兩者之間)便又互相牽連起來。

    更多信息請查看IT技術(shù)專欄

    更多信息請查看腳本欄目
    易賢網(wǎng)手機(jī)網(wǎng)站地址:從零學(xué)Python之引用和類屬性的初步理解
    由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

    2025國考·省考課程試聽報(bào)名

    • 報(bào)班類型
    • 姓名
    • 手機(jī)號
    • 驗(yàn)證碼
    關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機(jī)站點(diǎn) | 投訴建議
    工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
    云南網(wǎng)警備案專用圖標(biāo)
    聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
    咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
    云南網(wǎng)警報(bào)警專用圖標(biāo)