3 回答

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超10個(gè)贊
Python語言的每個(gè)實(shí)現(xiàn)都可以自由地在分配不可變對象(例如字符串)時(shí)做出權(quán)衡 - 要么創(chuàng)建一個(gè)新的對象,要么找到一個(gè)現(xiàn)有的等價(jià)對象并再使用一個(gè)對它的引用,就好了。觀點(diǎn)看法。當(dāng)然,在實(shí)踐中,現(xiàn)實(shí)世界的實(shí)現(xiàn)需要合理的妥協(xié):在定位這樣的對象時(shí),再一次提及合適的現(xiàn)有對象既便宜又容易,只要找到一個(gè)合適的現(xiàn)有對象(可能是可能不存在)看起來可能需要很長時(shí)間搜索。
因此,例如,在單個(gè)函數(shù)中多次出現(xiàn)相同的字符串文字(在我所知的所有實(shí)現(xiàn)中)都使用“對同一對象的新引用”策略,因?yàn)樵跇?gòu)建該函數(shù)的常量池時(shí),它非常快速且容易避免重復(fù); 但是跨越不同的功能這樣做可能是一項(xiàng)非常耗時(shí)的任務(wù),因此現(xiàn)實(shí)世界的實(shí)施要么根本不做,要么只在一些啟發(fā)式確定的案例子集中做到這一點(diǎn),人們可以希望合理權(quán)衡編譯時(shí)間(通過搜索相同的現(xiàn)有常量減慢)與內(nèi)存消耗(如果繼續(xù)生成新的常量副本,則增加)。
我不知道Python的任何實(shí)現(xiàn)(或者其他具有常量字符串的語言,例如Java)在從文件讀取數(shù)據(jù)時(shí)會(huì)花費(fèi)很多時(shí)間來識(shí)別可能的重復(fù)項(xiàng)(通過多個(gè)引用重用單個(gè)對象) - - 它似乎并不是一個(gè)很有希望的權(quán)衡(在這里你需要支付運(yùn)行時(shí)間,而不是編譯時(shí)間,因此權(quán)衡更具吸引力)。當(dāng)然,如果您知道(由于應(yīng)用程序級別的考慮因素)這些不可變對象很大并且很容易出現(xiàn)重復(fù),您可以非常輕松地實(shí)現(xiàn)自己的“常量池”策略(實(shí)習(xí)生可以幫助您為字符串執(zhí)行此操作,但是你不難推出自己的東西,例如,帶有不可變項(xiàng)目的元組,巨大的長整數(shù),

TA貢獻(xiàn)1816條經(jīng)驗(yàn) 獲得超4個(gè)贊
我強(qiáng)烈懷疑Python在這里表現(xiàn)得像許多其他語言一樣 - 在源代碼中識(shí)別字符串常量并使用公用表,但在動(dòng)態(tài)創(chuàng)建字符串時(shí)不應(yīng)用相同的規(guī)則。這是有道理的,因?yàn)樵创a中只有一組有限的字符串(當(dāng)然,Python允許你動(dòng)態(tài)地評估代碼),而你在程序過程中創(chuàng)建大量字符串的可能性更大。 。
這個(gè)過程通常被稱為實(shí)習(xí) - 實(shí)際上,通過這個(gè)頁面的外觀,它也被稱為Python實(shí)習(xí)。

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超4個(gè)贊
旁注:了解Python中對象的生命周期非常重要。請注意以下會(huì)話:
Python 2.6.4 (r264:75706, Dec 26 2009, 01:03:10) [GCC 4.3.4] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> a="a">>> b="b">>> print id(a+b), id(b+a)134898720 134898720>>> print (a+b) is (b+a)False
您認(rèn)為通過打印兩個(gè)單獨(dú)表達(dá)式的ID 并注意到“它們是相等的,兩個(gè)表達(dá)式必須相等/等同/相同”是錯(cuò)誤的。單行輸出并不一定意味著它的所有內(nèi)容都是在同一時(shí)刻創(chuàng)建和/或共存的。
如果您想知道兩個(gè)對象是否是同一個(gè)對象,請直接詢問Python(使用is
運(yùn)算符)。
添加回答
舉報(bào)