日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python元组为什么不可变_为什么python字符串和元组是不可变的?

發(fā)布時(shí)間:2025/3/11 python 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python元组为什么不可变_为什么python字符串和元组是不可变的? 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我不知道為什么字符串和元組是不可變的;使它們不可變的優(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。