python元組為什么不可變_為什么python字符串和元組是不可變的?

我不知道為什么字符串和元組是不可變的;使它們不可變的優點和缺點是什么?

除了Python解釋器的內部實現,這種設計在編寫程序上是否有很好的意義?(例如,如果元組和字符串是可變的,會更容易嗎?)如果是這樣,那么選擇不可變元組和列表的例子是什么?(或pherhaps、可變字符串與python字符串)

有一種稱為函數式編程的完整編程風格,其中所有東西都是不可變的。en.wikipedia.org/wiki/functional_編程

python確實有可變的字符串和元組;它們分別拼寫為bytearray和list。

所謂的fakemutablepython Imagine a語言,你可以在搜索字符串的賦值和年齡使用列表(如mystr[0] = 'a')

a ="abc"

這是創建在內存中存儲的地址進入0x1,含"ABC",和標識符a指向它。

現在,說你做的。

b = a

本b點創建的標識符和它同一個內存地址0x1

現在,如果你的字符串是mutable,b變更:

b[0] = 'z'

這個年齡的第一個字節的字符串存儲在一個z0x1。標識符是從一個a來指向字符串,因此這會改變的,所以……

print a

print b

兩個輸出..would zbc

這可以讓一些真正奇怪,意想不到的行為。字典的鍵是一個很好的例子是這樣:

mykey = 'abc'

mydict = {

mykey: 123,

'zbc': 321

}

anotherstring = mykey

anotherstring[0] = 'z'

現在事情變得fakemutablepython奇,而你的詞典中有兩個鍵,"ABC"和"ZBC"。然后你的年齡"abc"字符串(通過"標識符"anotherstringZBC)",因此"雙鍵的安切洛蒂,ZBC"和"ZBC"……

一個可能的解決方案在本weirdness,每當你分配一個標識符的字符串(或使用它作為一個關鍵的副本),它是在具備0x1字符串。

這可防止上面的,但如果你有一個字符串,需要200內存?

a ="really, really long string [...]"

b = a

突然,你的腳本需要啟動400MB的記憶?這不是很好。

我們點什么,如果它同一個內存地址,直到我們修改它?copy on write。這個問題是相當復雜的,可以做的。

這是immutability是在哪里。而不是要求的.replace()同體復制到一個新的字符串從內存地址,然后修改它的回報。我們只是讓所有的不可變的字符串和函數,因此必須創建一個新字符串返回。這解釋了以下的代碼:

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()函數返回的對象的內存地址)

+1最佳答案。真的?

我聽過最好的解釋!

那么,如果我說a="abc",b="abcd"它會共享abc嗎?就像b[:4]是a?

@Dineshkumar不,我很確定"abc"和"abcd"是不同的,完全無關的,對象-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

一大優勢是,他們制作的不可變的,他們可以被用來作為在一個字典的鍵。我可以使用內部數據結構詞典是由他們的時間點,如果把鑰匙是沒有改變。

您可以通過任何用戶創建的對象實例(顯然是可變的)進行鍵控。然后"key"可能只是內存地址,如果字符串是可變的,您仍然可以通過它們的唯一內存地址來設置key。

@triptych不是你想要的字符串——你希望它們按值鍵,否則字典就沒什么用處了……

@Hejazzman這不是python指令的工作方式。文字字符串值不用作dict鍵,而是采用字符串的哈希值。用'abc'.__hash__()向自己證明這一點。

@你說的每一句話都是錯的。首先,可以有兩個地址不同的相等字符串,因此使用該地址不起作用。第二,當dict使用字符串的散列時,關鍵是字符串本身——通過顯示d.keys()來證明它。您可以很容易地擁有兩個具有相同哈希值的字符串,而dict會將它們分開。

@標記勒索而不是地址,哈希。根據定義,不能有兩個具有相同哈希值但具有不同哈希值的字符串進行比較。

@你八年前的第一次評論是關于記憶地址的,但我當時沒有回復。正確的做法是,不能使用相同的字符串和不同的哈希值,但可以使用相同的哈希值使用不同的字符串!散列本身不足以作為密鑰,它只是機制的一部分。

@triptych我知道python dicts是如何工作的(或者任何語言的hashmaps)。這不是我的觀點。我的觀點是,相同的字符串應該能夠指向相同的條目,對于可變的字符串(以及它們作為hashmap中的鍵的"唯一內存地址")則不是這樣。然后需要有完全相同的字符串指針,而不僅僅是相同的字符串內容,才能從字典中獲取條目。

不可變的類型是conceptually多mutable比簡單酮。例如,你不constructors測量與復制或const的正確性在C + +類。越是不可變類型,語言變得更容易。因此,在最簡單的語言是純粹的功能狀態(因為沒有任何一個lambda演算的全球多更容易比圖靈機,和同樣強大的),雖然很多人不欣賞的人。

Perl的字符串函數和mutable安切洛蒂似乎只是罰款。上面的手似乎很多rationalization揮手和一個任意的設計決策。

我的答案的問題,為什么Python Python字符串不可變的安切洛蒂,Guido van Rossum通緝的創造者,因為它現在已經這樣,他都是個特殊的legions任意決策和呼吸死亡。

你可以有類似的姿勢的問題為什么Perl沒有不可變的字符串和一個完整的人會寫在passel知識觀的字符串是不可變的,以及為什么它是非常bestest IDEA"(TM)是Perl沒有他們。

Perl實際上沒有字符串:它有scalar,可以作為字符串或數字(后者有多種類型)。如果scalar是不可變的,它將成為純粹的函數Perl,世界各地的Perl開發人員將通過為自己分配UNdef來自殺。

優點:性能

缺點:你不能改變mutables。

專家:你不能改變它們

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/542028.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/542028.shtml
英文地址,請注明出處:http://en.pswp.cn/news/542028.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

InnoDB事務結構體代碼變量列表

事務結構 struct trx_t 寫在前面 InnoDB是MySQL的一個存儲引擎,支持事務,支持非堵塞的一致性讀,物理存儲結構是Page,每個事務都有回滾日志,重做日志,事務還會有死鎖檢測,各種各樣不同的鎖等等等…

對cookie與session的理解

cookie: 在網站中,http請求是無狀態的。也就是說即使第一次和服務器連接后并且登錄成功后,第二次請求服務器依然不能知道當前請求是哪個用戶。 cookie的出現就是為了解決這個問題, 第一次登錄后服務器返回一些數據(…

ubutun 更換網絡源_Ubuntu 更換源

1.切換到root用戶# su root備份源文件 目錄:/etc/apt# cd /etc/apt/# cp sources.list sources.list.bk3.更換源 阿里源 清華源# >sources.list # 清空源# vim sources.list # 選擇一個源,復制進去# apt update # 更新源,需要等幾分鐘# ex…

php : 常用函數

常用函數&#xff1a; <?php /*** 獲取客戶端IP* return [string] [description]*/ function getClientIp() {$ip NULL;if (isset($_SERVER[HTTP_X_FORWARDED_FOR])) {$arr explode(,, $_SERVER[HTTP_X_FORWARDED_FOR]);$pos array_search(unknown,$arr);if(false ! $po…

java日歷類add方法_Java日歷setFirstDayOfWeek()方法與示例

java日歷類add方法日歷類setFirstDayOfWeek()方法 (Calendar Class setFirstDayOfWeek() method) setFirstDayOfWeek() method is available in java.util package. setFirstDayOfWeek()方法在java.util包中可用。 setFirstDayOfWeek() method is used to sets the first day o…

zabbix監控部署 與添加主機

zabbix介紹&#xff1a; zabbix&#xff08;[zbiks]&#xff09;是一個基于WEB界面的提供分布式系統監視以及網絡監視功能的企業級的開源解決方案。zabbix能監視各種網絡參數&#xff0c;保證服務器系統的安全運營&#xff1b;并提供靈活的通知機制以讓系統管理員快速定位/解決…

線段樹 洛谷 p1531 I hate it(I hate it too)

這里寫鏈接內容 線段樹模板 字符串是一個很詭異的問題。。。。 #include<cstdio> #include<iostream> #include<string> #define q 200000 using namespace std; int a[q5],s[q<<25]; void bu(int o,int l,int r)//建樹 {if(lr){s[o]a[r];} else{int…

打開是什么樣子的圖片_情侶頭像 | 無論是什么樣子的你 我都好喜歡

點擊【情侶圖片大全】- 右上角找到【…】立刻設我為星標/置頂 - 不迷路哦情侶圖片大全“時光真瘋狂&#xff0c;我一路執迷與匆忙”情侶/閨蜜/動漫/閨蜜網名長按圖片保存 點擊圖片放大圖片高清&#xff0c;建議在 W i f i 下瀏覽這個世界是多么神奇我竟然遇見了你無論是什么…

Java File類File [] listFiles()方法(帶示例)

File類File [] listFiles() (File Class File[] listFiles()) This method is available in package java.io.File.listFiles(). 軟件包java.io.File.listFiles()中提供了此方法。 This method is used to return the names of all the files in the form of an array of files…

zabbix監控平臺添加服務(http,nginx,mysql)

1 . 監控httpd服務&#xff1a; 首先確保已經搭建zabbix監控平臺&#xff0c;并且將需要監控的主機已經添加。 對主機server2 上的http服務進行監控&#xff0c;首先確保server2主機安裝了http服務。 使用http在zabbix中自帶監控模版 點擊配置->主機->server2->模…

java為什么要重寫hashCode和equals方法

如果不被重寫&#xff08;原生&#xff09;的hashCode和equals是什么樣的&#xff1f;不被重寫&#xff08;原生&#xff09;的hashCode值是根據內存地址換算出來的一個值。 不被重寫&#xff08;原生&#xff09;的equals方法是嚴格判斷一個對象是否相等的方法&#xff0…

stl中map函數_map :: max_size()函數,以及C ++ STL中的Example

stl中map函數C STL映射:: max_size() (C STL map::max_size() ) It returns the maximum number of elements the container(map) is able to hold but at runtime, the size of the container may be limited to a value smaller than specified by max_size() by the amount…

arduino 藍牙示例_Arduino簡單實例之八_藍牙模塊

1) 說明&#xff1a;藍牙模塊用于和手機或其它帶藍牙的設備通訊。藍牙設備分為主從兩種模式&#xff0c;作為主設備時&#xff0c;它查找和連接其它設備&#xff1b;作為從設備時只能被只它設備連接&#xff1b;通訊模式分透明傳輸和AT命令模式。最好購買主從一體的藍牙模…

zabbix使用JMX監控tomcat

JMX 全稱是Java Management Extensions,即Java管理擴展。Java程序會開放一些端口&#xff0c;用來獲取運行狀況。 從Zabbix2.0開始&#xff0c;內置了監控JMX的功能,叫做"Zabbix Java Gateway ",在Zabbix Serve上會啟動名為"Zabbix Java Gateway "的進程&…

自定義控件添加屬性_|AutoCAD LT 2019 Mac自定義功能區的方法

AutoCAD LT是一款非常好用的CAD三維設計繪圖軟件&#xff0c;最新版本2019擁有改進的桌面、新應用實現跨設備工作流&#xff0c;以及DWG比較等新功能&#xff0c;并且AutoCAD LT 2019 Mac可以根據你的需要和工作習慣來自定義功能區&#xff0c;下面為大家帶來自定義功能區的詳細…

操作系統中的文件系統和訪問方法

文件 (File) A file is basically a sequence of bytes organized into blocks that are understandable by any machines. In other words, the collection of related information that is stored in a secondary storage device is also called a file. The file is a colle…

centos7鏡像加速_docker 鏡像加速CentOS7詳細介紹

前言在Docker Hub官網上注冊帳號&#xff0c;即可下載使用倉庫里的全部的docker鏡像。而因為網絡原因&#xff0c;國內的開發者沒辦法流暢的下載鏡像&#xff0c;經常會出現下載中斷的錯誤。解決方法就是使用國內的容器Hub加速服務&#xff0c;本質就是更改pull優先級較高的服務…

java 根據類名示例化類_Java LocalDateTime類| atOffset()方法與示例

java 根據類名示例化類LocalDateTime類atOffset()方法 (LocalDateTime Class atOffset() method) atOffset() method is available in java.time package. atOffset()方法在java.time包中可用。 atOffset() method is used to create an OffsetDateTime to merge this LocalDat…

Zabbix監控——proxy 分布式監控配置

proxy分布式監控 Zabbix proxy是在大規模分布式監控場景中&#xff0c;采用的一種用以分擔server端壓力的分層結構&#xff0c; proxy可以代替zabbix server檢索客戶端的數據&#xff0c;然后把數據匯報給zabbix server&#xff0c;極大的減輕了server的負載壓力&#xff0c;使…

AutoCAD_acadiso.dwt卡死

2019獨角獸企業重金招聘Python工程師標準>>> 問題描述&#xff1a;每次執行到打開acadiso.dwt就卡死&#xff0c;且電腦顯示有網&#xff0c;確打不開網頁 可能原因&#xff1a;可能是因為AotuCAD是盜版的 解決辦法&#xff1a; 1.在任務管理器中把WSCommCntr.exe進…