說(shuō)明:本系列文章翻譯自 Python 3.5.0 官方文檔的 Python 語(yǔ)言參考。翻譯不按順序,學(xué)習(xí)到哪塊就優(yōu)先翻譯哪塊,翻譯過(guò)的文章會(huì)在對(duì)應(yīng)標(biāo)簽處添加超鏈接??紤]到筆者“粗大”的英語(yǔ)水平,翻譯的文章如令您不適,請(qǐng)嘗試換個(gè)方式打開(kāi)~
翻譯有兩個(gè)目的:一是鍛煉自己的英語(yǔ)水平;二是覺(jué)得官方文檔才是最新,最靠譜的。
歡迎各位多提建議,也歡迎有興趣的同學(xué)共同翻譯,共同進(jìn)步,謝謝。
對(duì)象是 Python 對(duì)數(shù)據(jù)的抽象。所有數(shù)據(jù)在 Python 中以對(duì)象或?qū)ο笾g的關(guān)系呈現(xiàn)。(從某種意義上說(shuō),也為了與馮·諾依曼的“存儲(chǔ)程序計(jì)算機(jī)”模式一致,代碼也使用對(duì)象呈現(xiàn)。)
每個(gè)對(duì)象都有一個(gè)身份標(biāo)識(shí),一個(gè)類型和一個(gè)值。對(duì)象的身份標(biāo)識(shí)一旦被創(chuàng)建就不會(huì)改變;你可以認(rèn)為它是對(duì)象在內(nèi)存中的地址。is操作符用來(lái)比較兩個(gè)對(duì)象;id()方法返回一個(gè)代表對(duì)象身份標(biāo)識(shí)的整型。
CPython 實(shí)現(xiàn)細(xì)節(jié):對(duì) CPython 來(lái)說(shuō),id(x) 是 x在內(nèi)存中的地址。
一個(gè)對(duì)象的類型決定了該對(duì)象支持的操作符(比如:“它是否有長(zhǎng)度?”)并且還定義了該類型對(duì)象可能的取值。type()函數(shù)返回一個(gè)對(duì)象的類型(類型本身也是一個(gè)對(duì)象)。對(duì)象的類型就向它的身份標(biāo)識(shí)一樣是不可變的。[1]
有些對(duì)象的值是可變的。值可變的對(duì)象被稱為可變對(duì)象(mutable);一旦創(chuàng)建,其值就不可改變的對(duì)象被稱為不變對(duì)象(immutable)。(當(dāng)不變對(duì)象容器中包含一個(gè)可變對(duì)象的引用時(shí),它的值隨后者的變化而改變;然而該容器仍被視為不變對(duì)象,因?yàn)樗募蠈?duì)象是不可變的。所以不變性并不以為著擁有一個(gè)不可改變的值,這是個(gè)非常微妙的含義。)對(duì)象的可變性由它的類型決定;實(shí)例、數(shù)字、字符串、元組是不變對(duì)象,字典和列表是可變對(duì)象。
譯者注:括號(hào)中的內(nèi)容不好理解,舉個(gè)例子:
l = ['apple', 'banana'] t = ('beef', l) print(t) # ('beef', ['apple', 'banana']) l.append('grape') print(t)# ('beef', ['apple', 'banana', 'grape'])
t是不變對(duì)象,但它包含有一個(gè)l的引用,l是個(gè)可變對(duì)象,當(dāng)l的值變化時(shí),t的值也跟著變化,但由于t始終持有的都是對(duì)l的引用(不是其他對(duì)象的引用),所以t仍然是一個(gè)不變對(duì)象。
對(duì)象從不會(huì)明確銷毀;然而,當(dāng)它們變得不可達(dá)時(shí)會(huì)被垃圾回收(garbage-collected)。一個(gè)延遲被垃圾回收或完全被忽略的措施是允許的--垃圾回收如何實(shí)現(xiàn)是該措施質(zhì)量的要素,不應(yīng)有對(duì)象在仍然可用時(shí)被回收掉。
CPython 實(shí)現(xiàn)細(xì)節(jié):CPython當(dāng)前使用一個(gè)引用-計(jì)數(shù)(reference-counting)方案和(可選的)延遲偵測(cè)周期性鏈接垃圾,一旦對(duì)象不可用就盡可能多的回收它們,但此方案并不保證包含循環(huán)引用的垃圾被回收。請(qǐng)?jiān)?a href="" target="_blank">gc文檔中查看空值循環(huán)垃圾回收的信息。其他實(shí)現(xiàn)也都不盡相同,并且 CPython也可能會(huì)改變。不要相信當(dāng)對(duì)象不可用時(shí)會(huì)立即立即終止(所以你始終應(yīng)該明確關(guān)閉文件。)
需要注意的是,使用實(shí)現(xiàn)的跟蹤或調(diào)試工具可能會(huì)在對(duì)象通??梢员换厥盏那闆r下保持對(duì)象可用。也要注意使用try...catch語(yǔ)句捕捉異常也可能會(huì)保持對(duì)象可用。
有些對(duì)象--比如打開(kāi)文件或窗口--會(huì)包含對(duì)“內(nèi)部”資源的引用。這些資源在對(duì)象被回收后應(yīng)該被釋放,但由于垃圾回收機(jī)制不對(duì)此作保證,此類對(duì)象會(huì)提供明確釋放內(nèi)部資源的辦法,通常是一個(gè)close()方法。強(qiáng)烈建議程序明確關(guān)閉此類對(duì)象。try...finally語(yǔ)句和with語(yǔ)句為此提供了便捷的方式。
一些對(duì)象包含對(duì)其他對(duì)象的引用,這類對(duì)象稱作容器。元組、列表、字典都是容器。那些引用是容器值的一部分。多數(shù)情況下,我們談?wù)摰娜萜鞯闹抵傅氖侨萜髦械脑?,而不是容器?duì)象的身份標(biāo)識(shí)。然而,當(dāng)我們談?wù)撊萜骺勺冃詴r(shí),我們指的是直接包含的對(duì)象的身份標(biāo)識(shí)。所以,如果一個(gè)不變?nèi)萜鳎ū热缭M)包含一個(gè)可變對(duì)象的引用,它的值隨著可變對(duì)象的改變而改變。
類型影響對(duì)象行為的方方面面。盡管對(duì)象身份標(biāo)識(shí)的重要性在一些情況下會(huì)被影響:對(duì)于不變類型,計(jì)算新值的運(yùn)算實(shí)際上返回帶有同樣類型和值的任意已存在對(duì)象的引用,然而對(duì)于可變對(duì)象著是不被允許的。例如:對(duì)于?a = 1; b = 1, a和b可能會(huì)(也可能不會(huì))引用同一個(gè)值為1的對(duì)象,這決定于系統(tǒng)實(shí)現(xiàn);但是對(duì)于c = []; d = [],c和d被保證引用兩個(gè)不同的,唯一的新創(chuàng)建的空列表。(注意,對(duì)于c = d = [],c和d只想同一個(gè)對(duì)象。)
PS:翻譯真不是一個(gè)輕巧活,自己看的懂容易,翻譯出來(lái)讓大家都看懂卻很有難度。如果大家有看不懂的地方請(qǐng)?jiān)谖恼孪路搅粞?,如果有翻譯不準(zhǔn)確的地方也請(qǐng)各位批評(píng)指正,謝謝。