Python缺乏調查的陷阱 動態執行個體屬性、引用、逃生

來源:互聯網
上載者:User

標籤:

——看到哪裡。想到哪裡,記到哪裡

非常多時候。非常多人學python的時候,會忽略的東西非常多。大多數都盯著能“出貨”即可,可是通常在讀別人的代碼的時候發現,看不懂。。。一方面是自己的代碼技巧和經驗不足;還有一方面就是自己掌握的東西不全面。而這些往往是基礎的東西。還不算高大上的東西。。

第一:動態執行個體屬性

Python的類,物件導向的東西和其它語言不太一樣。比方執行個體的屬性是能夠動態分配的。本來沒有的。能夠自己加上,就算類中未定義,也能夠用,挺方便的。可是建議能一次行定義完整最好,以下舉個粒子:

>>> class Address(object):...         def __init__(self,name,phone):...               self.name = name...               self.phone = phone... >>> jhon = Address('Jhon dov','123456')>>> jhon.name'Jhon dov'>>> jhon.phone'123456'>>> jhon.wa = 'aaa'>>> print jhon.waaaa
jhon.wa這個,就是執行個體屬性的動態分配。原來類中未定義wa屬性,可是我們能夠通過jhon執行個體建立一個。

第二,可變不可變,傳引用傳值

究竟傳值還是傳引用。。

有時候會亂,那是由於理解不深刻啊。python中還是非常好區分的,舉個粒子:

>>> list1 = [1,'a',['foo','bar'],('cc','opo')]>>> list2 = list1>>> list2[0]1>>> list2[2]['foo', 'bar']>>> list2[3]('cc', 'opo')>>> list2[3][0]'cc'>>> list2[0] = 2>>> list2[2][0] = 'wang'>>> list1[2, 'a', ['wang', 'bar'], ('cc', 'opo')]>>> list2[2, 'a', ['wang', 'bar'], ('cc', 'opo')]>>> list1[3][0] = 'dd'Traceback (most recent call last):  File "<stdin>", line 1, in <module>TypeError: 'tuple' object does not support item assignment
能夠看出來。直接賦值的這樣的傳的是引用,就是說list1、list2指向的是記憶體中同樣的地方,就像一個人取了倆名字,這點還是非常好理解的

再來個栗子:

>>> alist = list(list1)>>> alist[2, 'a', ['wang', 'bar'], ('cc', 'opo')]>>> list1[2, 'a', ['wang', 'bar'], ('cc', 'opo')]>>> alist[0] = 3>>> alist[1] = 'Z'>>> alist[2][1] = "rab">>> alist[3][0] = "111"Traceback (most recent call last):  File "<stdin>", line 1, in <module>TypeError: 'tuple' object does not support item assignment>>> alist[3] = ['1','2','3']>>> alist[3, 'Z', ['wang', 'rab'], ['1', '2', '3']]>>> list1[2, 'a', ['wang', 'rab'], ('cc', 'opo')]
這次不是直接賦值,可是一開始我們比較alist和list1,發現內容一樣的。往下看,當對alist中的前兩個元素更改的時候,最後與list1不一樣了,list1的前兩個元素沒變。alist變了,這是由於前兩個元素,一個是整數一個是字串,都是不可變的。所以,alist中的前兩個元素事實上是list1前兩個元素的傳值的效果。就是說兩者僅僅是值同樣,記憶體中有兩份。可是記憶體中的位置不一樣,所以更改alist中的前兩個元素時。不影響list1中的;再看list1中的[‘wang‘,‘bar‘]。這本身就是個列表,我們知道,列表是可變的,所以在python中。這個列表傳的是引用。記憶體中僅僅有一份,所以,改變alist中的這個列表,list1中的也會改變,最後示範了一下。列表中的元組,元組本身不可變,所以更改元組中內容會報錯,且傳遞的是值,可是這個元組作為一個列表中的元素,我們能夠總體替換掉。

可能說的比較亂,自己動手試試就知道了,這就是一個“淺拷貝”和“深拷貝”問題,淺拷貝顧名思義,拷貝的非常淺,能夠理解為倒賣指標的傢伙,同喝一杯飲料,就是傳引用。再詳細點的栗子就是,借別人一個東西。無論怎麼借,東西就是一個,不會自己添加,假設有人把借的東西用壞了,那就真壞了;深拷貝,傳值,每一個人一杯飲料。舉個栗子就是,你看見別人一個杯子非常好看,你也想有一個。於是你也買了一個一樣的杯子,兩個杯子是一樣的,可是所屬人不一樣,假設你不小心把杯子弄啐了,別人的杯子是不可能也跟著壞的。。。

第三,字串抑制轉義

新手一開始在讀別人代碼的時候,特別是讀寫檔案那部分,總會遇到轉義的問題,還有不明確轉義是什麼的也不在少數。照貓畫虎的也有。真正理解事實上非常easy就是‘\’與其它字元拼在一起的時候。會變成其它的含義,給了幾個範例

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcmVjc3lzbWw=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

另一個明顯且常見的,file = open(‘C:\new\text.dat‘,‘w‘),我們覺得這是開啟此檔案夾下的dat檔案。可是這樣不行,由於\n是分行符號,\t是定位字元。那怎麼解決?

一個通用的方法就是:字串抑制轉義,使用方法如:

file = open(r'C:\new\text.dat','w')
解釋:假設r(大寫或者小寫)出如今字串的第一個引號的前面,將會自己主動關閉轉義機制

還能夠這樣解決:

file = open('C:\\new\\text.dat','w')
事實上這兩種方式基本一樣,如:

>>> path = r'C:\new\text.dat'>>> path'C:\\new\\text.dat'>>> print pathC:\new\text.dat>>> 






著作權聲明:本文部落格原創文章,部落格,未經同意,不得轉載。

Python缺乏調查的陷阱 動態執行個體屬性、引用、逃生

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.