摘要:一對象引用基礎(chǔ)知識變量是標(biāo)注而不是容器。也就是說元組中不可變的是元素的標(biāo)識,但元組的值會隨著引用的可變對象變化而變化。在中每個對象的引用都會有統(tǒng)計。弱引用不會妨礙對象被當(dāng)做垃圾回收。
導(dǎo)語:本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之面向?qū)ο笃闹攸c知識及個人心得,打算入門Python的朋友們可以來一起學(xué)習(xí)并交流。
本文重點:
1、明確變量保存的是引用這一本質(zhì);一、對象引用基礎(chǔ)知識
2、熟悉對象引用的基礎(chǔ)知識;
3、掌握深復(fù)制和淺復(fù)制;
4、熟悉函數(shù)傳參引用時潛在的麻煩并避免。
變量:是標(biāo)注而不是容器。對引用式變量而言,是把變量分配給對象,反過來理解則不合理。
別名:同一個對象的不同標(biāo)注就是別名,別名指向同一對象。
標(biāo)識:可以把標(biāo)識理解為對象在內(nèi)存中的地址。每個變量都有標(biāo)識、類型和值。對象一旦創(chuàng)建,它的標(biāo)識絕不會變。is運算符比較兩個對象的標(biāo)識;id()函數(shù)返回對象標(biāo)識的整數(shù)表示,即對象的內(nèi)存地址。
相等性:用==運算符比較兩個對象的值是否相等。注意a==b是語法糖,等同于a.__eq__(b)。
==和is的選擇:我們關(guān)注值的頻率比標(biāo)識要高。
當(dāng)比較變量和單例值的時候應(yīng)該用is。例如:X is None 或 X is not None。
is運算符比==要快,因為is不能重載。
二、可變性 1、元組的相對不可變性:指tuple數(shù)據(jù)結(jié)構(gòu)的物理內(nèi)容(即保存的引用)不可變。也就是說元組中不可變的是元素的標(biāo)識,但元組的值會隨著引用的可變對象變化而變化。
tuple,list,dict,set保存的是對象的引用,而str,byte,array.array保存的是對象的值(字符,字節(jié),數(shù)字)。
淺復(fù)制:當(dāng)復(fù)制tuple,list,dict,set時,副本之間共享內(nèi)部對象的引用。copy.copy()
深復(fù)制:當(dāng)復(fù)制tuple,list,dict,set時,副本之間不共享內(nèi)部對象的引用。copy.deepcopy()
eg:淺復(fù)制小例子
list1=[1,(55,66),[7,8,9]] list2=list(list1)#構(gòu)建副本默認(rèn)為淺復(fù)制 list2[1]+=(77,88)#對元組進行+=運算會解綁list2[1],并與右端運算后的值之間重新綁定起來。 list2[2]+=[10]#對列表進行iadd運算會就地修改列表,不會發(fā)生重新綁定。 list2[0]*=3 list1[2].pop(0) print(list1) print(list2)
#輸出: [1, (55, 66), [8, 9, 10]] [3, (55, 66, 77, 88), [8, 9, 10]]
分析:list2是list1的副本,我們對list2的三個元素均作了改動,但只有列表元素的改動影響到了list1。原因在于list1和list2的第三個列表元素共享引用,因此影響也會同步;元組因為發(fā)生了解綁的運算所以影響未同步到list1;至于數(shù)值的影響不同步的原因是因為淺復(fù)制針對str,byte,array.array這些對象直接將值重新保存到副本中來,不存在共享引用的內(nèi)部邏輯。
深復(fù)制注意事項:
深復(fù)制處在循環(huán)引用的對象時,深復(fù)制算法會進入無限循環(huán)中。
一些對象可能會引用不該復(fù)制的外部資源或單例值,這些對象的深復(fù)制的結(jié)果可能太深。
3、函數(shù)的參數(shù)作為引用時:Python唯一支持的參數(shù)傳遞模式是共享傳參。共享傳參指函數(shù)的各個形式參數(shù)獲得實參中各個引用的副本,即函數(shù)內(nèi)部的形參是實參的別名。
函數(shù)可能會修改作為參數(shù)傳入的可變對象。
(1)這個行為無法避免,除非在本地創(chuàng)建副本,或者使用不可變對象。
(2)因此在類中直接把參數(shù)賦值給實例變量之前一定要三思,因為這樣會為參數(shù)對象創(chuàng)建別名,修改傳入?yún)?shù)指向的可變對象。
eg:函數(shù)修改作為參數(shù)傳入的全局變量
def f(a, b): a += b return a a = [1, 2] b = [3, 4] f(a, b) print(a, b)#輸出[1, 2, 3, 4], [3, 4],此時列表a已經(jīng)發(fā)生變化。 t = (10, 20) u = (30, 40) f(t, u) print(t, u)#輸出((10, 20), (30, 40)),此時元組t沒有發(fā)生變化。
使用可變類型作為函數(shù)參數(shù)的默認(rèn)值有危險。
原因在于包含此類函數(shù)的類的實例在未指定初始值時會使用同一個可變默認(rèn)值。當(dāng)一個實例就地修改參數(shù)時會影響其他實例對默認(rèn)值的調(diào)用。
主要采用引用計數(shù)算法。
在Python中每個對象的引用都會有統(tǒng)計。當(dāng)引用計數(shù)歸零時,對象就會立即銷毀。
除了循環(huán)引用外沒有其他引用,處在循環(huán)引用的對象都會被銷毀。
2、弱引用某些情況下可能需要保存對象的引用,但不留存對象本身,此時可以借助弱引用實現(xiàn)。弱引用不會妨礙對象被當(dāng)做垃圾回收。
弱引用是一種低層機制,是weakref模塊中WeakValueDictionary、WeakKeyDictionary和WeakSet等有用的集合類,以及finalize函數(shù)的底層支持。
弱引用的局限性
弱引用所指對象可以是set,用戶自定義的類,list和dict的子類。不可以是int、tuple的實例及子類,也不可以是list實例或dict實例。
1、使用一個元組來構(gòu)造另一個元組,得到的其實是同一個元組。
2、比較字符串或整數(shù)是否相等時,應(yīng)該使用==而不是is。這是由于Python解釋器內(nèi)部駐留的特性所導(dǎo)致的。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/41476.html
摘要:每個變量都有標(biāo)識類型和值對象一旦創(chuàng)建它的標(biāo)識絕不會變標(biāo)識可以簡單的理解為對象在內(nèi)存中的地址別名跟是別名指向如果增加新的內(nèi)容也會增加相等性為運算符比較連個對象的值對象中保存的數(shù)據(jù)標(biāo)識為因為他們都指向這個列表比較對象的標(biāo)識元組相對不可變性元組保 a = [1,2,3,4] b = a 每個變量都有標(biāo)識,類型和值.對象一旦創(chuàng)建,它的標(biāo)識絕不會變;標(biāo)識可以簡單的理解為對象在內(nèi)存中的地址. ...
摘要:函數(shù)的參數(shù)作為引用時唯一支持的參數(shù)傳遞模式是共享傳參,它指函數(shù)的形參獲得實參中各個引用的副本,即形參是實參的別名。而在上面這個例子中,類的屬性實際上是形參所指向的對象所指對象,的別名。 《流暢的Python》筆記本篇是面向?qū)ο髴T用方法的第一篇,一共六篇。本篇主要是一些概念性的討論,內(nèi)容有:Python中的變量,對象標(biāo)識,值,別名,元組的某些特性,深淺復(fù)制,引用,函數(shù)參數(shù),垃圾回收,de...
摘要:運算符比較兩個對象的標(biāo)識函數(shù)返回對象標(biāo)識的整數(shù)表示。實際上,每個對象都會統(tǒng)計有多少引用指向自己。對象被銷毀了,調(diào)用了回調(diào),的值變成了。當(dāng)對象的引用數(shù)量歸零后,垃圾回收程序會把對象銷毀。引用的目標(biāo)對象稱為所指對象。 對象不是個盒子 showImg(https://segmentfault.com/img/bV95mW?w=1784&h=988); class Gizmo: def...
摘要:對象引用和可變性變量不是盒子,而是便利貼變量的賦值方式比如是將一個變量分配給一個對象比如整數(shù)。運算符比較兩個對象的標(biāo)識函數(shù)返回對象標(biāo)識的整數(shù)表示。每個對象都會統(tǒng)計有多少引用指向自己。對象被銷毀執(zhí)行回調(diào)函數(shù)輸出 對象引用和可變性 變量不是盒子,而是‘便利貼’ >>> a = [1,2,3] >>> b = a >>> a.append(5) >>> a [1, 2, 3, 5] >>> ...
摘要:每個對象均有標(biāo)識符類型值。通常我們認(rèn)為當(dāng)這些對象被垃圾回收機制回收時,它占用的外部資源即被釋放。造物主類型對象的類型幾乎影響了該對象的所有功能,在某種程度上,對象的標(biāo)識符也受其類型的影響。 原文地址 對象 對象(Objects)是python中數(shù)據(jù)的抽象,python中所有的數(shù)據(jù)均可以用對象或者是對象之間的關(guān)系來表示。每個對象均有標(biāo)識符(identity)、類型(type)、值(val...
閱讀 4068·2021-09-27 13:35
閱讀 1184·2021-09-24 09:48
閱讀 2969·2021-09-22 15:42
閱讀 2404·2021-09-22 15:28
閱讀 3212·2019-08-30 15:43
閱讀 2680·2019-08-30 13:52
閱讀 3037·2019-08-29 12:48
閱讀 1544·2019-08-26 13:55