python元组为什么不可变_为什么python字符串和元组是不可变的?
我不知道為什么字符串和元組是不可變的;使它們不可變的優(yōu)點(diǎn)和缺點(diǎn)是什么?
除了Python解釋器的內(nèi)部實(shí)現(xiàn),這種設(shè)計(jì)在編寫程序上是否有很好的意義?(例如,如果元組和字符串是可變的,會(huì)更容易嗎?)如果是這樣,那么選擇不可變?cè)M和列表的例子是什么?(或pherhaps、可變字符串與python字符串)
有一種稱為函數(shù)式編程的完整編程風(fēng)格,其中所有東西都是不可變的。en.wikipedia.org/wiki/functional_編程
python確實(shí)有可變的字符串和元組;它們分別拼寫為bytearray和list。
所謂的fakemutablepython Imagine a語(yǔ)言,你可以在搜索字符串的賦值和年齡使用列表(如mystr[0] = 'a')
a ="abc"
這是創(chuàng)建在內(nèi)存中存儲(chǔ)的地址進(jìn)入0x1,含"ABC",和標(biāo)識(shí)符a指向它。
現(xiàn)在,說(shuō)你做的。
b = a
本b點(diǎn)創(chuàng)建的標(biāo)識(shí)符和它同一個(gè)內(nèi)存地址0x1
現(xiàn)在,如果你的字符串是mutable,b變更:
b[0] = 'z'
這個(gè)年齡的第一個(gè)字節(jié)的字符串存儲(chǔ)在一個(gè)z0x1。標(biāo)識(shí)符是從一個(gè)a來(lái)指向字符串,因此這會(huì)改變的,所以……
print a
print b
兩個(gè)輸出..would zbc
這可以讓一些真正奇怪,意想不到的行為。字典的鍵是一個(gè)很好的例子是這樣:
mykey = 'abc'
mydict = {
mykey: 123,
'zbc': 321
}
anotherstring = mykey
anotherstring[0] = 'z'
現(xiàn)在事情變得fakemutablepython奇,而你的詞典中有兩個(gè)鍵,"ABC"和"ZBC"。然后你的年齡"abc"字符串(通過(guò)"標(biāo)識(shí)符"anotherstringZBC)",因此"雙鍵的安切洛蒂,ZBC"和"ZBC"……
一個(gè)可能的解決方案在本weirdness,每當(dāng)你分配一個(gè)標(biāo)識(shí)符的字符串(或使用它作為一個(gè)關(guān)鍵的副本),它是在具備0x1字符串。
這可防止上面的,但如果你有一個(gè)字符串,需要200內(nèi)存?
a ="really, really long string [...]"
b = a
突然,你的腳本需要啟動(dòng)400MB的記憶?這不是很好。
我們點(diǎn)什么,如果它同一個(gè)內(nèi)存地址,直到我們修改它?copy on write。這個(gè)問(wèn)題是相當(dāng)復(fù)雜的,可以做的。
這是immutability是在哪里。而不是要求的.replace()同體復(fù)制到一個(gè)新的字符串從內(nèi)存地址,然后修改它的回報(bào)。我們只是讓所有的不可變的字符串和函數(shù),因此必須創(chuàng)建一個(gè)新字符串返回。這解釋了以下的代碼:
a ="abc"
b = a.replace("a","z")
證明和是由:
>>> a = 'abc'
>>> b = a
>>> id(a) == id(b)
True
>>> b = b.replace("a","z")
>>> id(a) == id(b)
False
(id()函數(shù)返回的對(duì)象的內(nèi)存地址)
+1最佳答案。真的?
我聽(tīng)過(guò)最好的解釋!
那么,如果我說(shuō)a="abc",b="abcd"它會(huì)共享abc嗎?就像b[:4]是a?
@Dineshkumar不,我很確定"abc"和"abcd"是不同的,完全無(wú)關(guān)的,對(duì)象-stackoverflow.com/questions/5722006/…
One is performance: knowing that a
string is immutable makes it easy to
lay it out at construction time —
fixed and unchanging storage
requirements. This is also one of the
reasons for the distinction between
tuples and lists. This also allows the
implementation to safely reuse string
objects. For example, the CPython
implemenation uses pre-allocated
objects for single-character strings,
and usually returns the original
string for string operations that
doesn’t change the content.
The other is that strings in Python
are considered as"elemental" as
numbers. No amount of activity will
change the value 8 to anything else,
and in Python, no amount of activity
will change the string"eight" to
anything else.
effbot.org http:/ / / / why-are-python-strings-immutable.htm pyfaq
一大優(yōu)勢(shì)是,他們制作的不可變的,他們可以被用來(lái)作為在一個(gè)字典的鍵。我可以使用內(nèi)部數(shù)據(jù)結(jié)構(gòu)詞典是由他們的時(shí)間點(diǎn),如果把鑰匙是沒(méi)有改變。
您可以通過(guò)任何用戶創(chuàng)建的對(duì)象實(shí)例(顯然是可變的)進(jìn)行鍵控。然后"key"可能只是內(nèi)存地址,如果字符串是可變的,您仍然可以通過(guò)它們的唯一內(nèi)存地址來(lái)設(shè)置key。
@triptych不是你想要的字符串——你希望它們按值鍵,否則字典就沒(méi)什么用處了……
@Hejazzman這不是python指令的工作方式。文字字符串值不用作dict鍵,而是采用字符串的哈希值。用'abc'.__hash__()向自己證明這一點(diǎn)。
@你說(shuō)的每一句話都是錯(cuò)的。首先,可以有兩個(gè)地址不同的相等字符串,因此使用該地址不起作用。第二,當(dāng)dict使用字符串的散列時(shí),關(guān)鍵是字符串本身——通過(guò)顯示d.keys()來(lái)證明它。您可以很容易地?fù)碛袃蓚€(gè)具有相同哈希值的字符串,而dict會(huì)將它們分開(kāi)。
@標(biāo)記勒索而不是地址,哈希。根據(jù)定義,不能有兩個(gè)具有相同哈希值但具有不同哈希值的字符串進(jìn)行比較。
@你八年前的第一次評(píng)論是關(guān)于記憶地址的,但我當(dāng)時(shí)沒(méi)有回復(fù)。正確的做法是,不能使用相同的字符串和不同的哈希值,但可以使用相同的哈希值使用不同的字符串!散列本身不足以作為密鑰,它只是機(jī)制的一部分。
@triptych我知道python dicts是如何工作的(或者任何語(yǔ)言的hashmaps)。這不是我的觀點(diǎn)。我的觀點(diǎn)是,相同的字符串應(yīng)該能夠指向相同的條目,對(duì)于可變的字符串(以及它們作為hashmap中的鍵的"唯一內(nèi)存地址")則不是這樣。然后需要有完全相同的字符串指針,而不僅僅是相同的字符串內(nèi)容,才能從字典中獲取條目。
不可變的類型是conceptually多mutable比簡(jiǎn)單酮。例如,你不constructors測(cè)量與復(fù)制或const的正確性在C + +類。越是不可變類型,語(yǔ)言變得更容易。因此,在最簡(jiǎn)單的語(yǔ)言是純粹的功能狀態(tài)(因?yàn)闆](méi)有任何一個(gè)lambda演算的全球多更容易比圖靈機(jī),和同樣強(qiáng)大的),雖然很多人不欣賞的人。
Perl的字符串函數(shù)和mutable安切洛蒂似乎只是罰款。上面的手似乎很多rationalization揮手和一個(gè)任意的設(shè)計(jì)決策。
我的答案的問(wèn)題,為什么Python Python字符串不可變的安切洛蒂,Guido van Rossum通緝的創(chuàng)造者,因?yàn)樗F(xiàn)在已經(jīng)這樣,他都是個(gè)特殊的legions任意決策和呼吸死亡。
你可以有類似的姿勢(shì)的問(wèn)題為什么Perl沒(méi)有不可變的字符串和一個(gè)完整的人會(huì)寫在passel知識(shí)觀的字符串是不可變的,以及為什么它是非常bestest IDEA"(TM)是Perl沒(méi)有他們。
Perl實(shí)際上沒(méi)有字符串:它有scalar,可以作為字符串或數(shù)字(后者有多種類型)。如果scalar是不可變的,它將成為純粹的函數(shù)Perl,世界各地的Perl開(kāi)發(fā)人員將通過(guò)為自己分配UNdef來(lái)自殺。
優(yōu)點(diǎn):性能
缺點(diǎn):你不能改變mutables。
專家:你不能改變它們
總結(jié)
以上是生活随笔為你收集整理的python元组为什么不可变_为什么python字符串和元组是不可变的?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: xor在PHP是什么意思,?=‘在PHP
- 下一篇: python正则匹配_Python正则表