python不支持i++運(yùn)算原理實(shí)例解析
引言
在 C/C++/Java 等語(yǔ)言中,整型變量的自增或自減操作是標(biāo)準(zhǔn)的。它們可以分為前綴操作(++i和--i)和后綴操作(i++和i--),它們有細(xì)微的區(qū)別和不同的用途。
那么為什么在 python 中不支持 i++ 等操作呢。
Python 中的整數(shù)是不可變類(lèi)型
當(dāng)我們定義 i = 1000 時(shí),不同的語(yǔ)言會(huì)有不同的處理。
像 C 這樣的語(yǔ)言(寫(xiě)為 int i = 1000)會(huì)分配一塊內(nèi)存并將其 “綁定” 到變量 i,同時(shí)寫(xiě)入可變值 1000。這里,i 的地址和類(lèi)型是固定的,而值是可變的(在一定范圍內(nèi))。
Python(寫(xiě)成 i = 1000)也會(huì)分配一塊內(nèi)存,但它會(huì)被 “綁定” 到數(shù)字 1000 上。這個(gè) 1000 的地址和類(lèi)型是固定的(不可變的),而 i 只是一個(gè)附在上面的名字標(biāo)簽,1000 沒(méi)有固定地址和類(lèi)型。
所以當(dāng)我們?cè)黾?i (i = i + 1) 時(shí),它們的處理是不同的:
在像 C 這樣的語(yǔ)言中,它首先找到存儲(chǔ)在 i 地址處的值,然后將其加 1。操作完成后,新值替換舊值。
在Python中,該過(guò)程包括將 i 指向的數(shù)字加1,然后將結(jié)果綁定到新分配的內(nèi)存塊,然后將名稱(chēng)標(biāo)簽 i 附加到這個(gè)新數(shù)字。新舊數(shù)字可以共存;它們不會(huì)互相替代。
有了上面的理解,我們?cè)賮?lái)看看i++,不難發(fā)現(xiàn):
在C語(yǔ)言中,i++可以表示 i 的數(shù)值屬性的增加。它不會(huì)分配新的內(nèi)存空間或創(chuàng)建新的一等公民。
在像 Python 這樣的語(yǔ)言中,如果 i++ 是對(duì)其 name 屬性的操作,那么它將毫無(wú)意義(你不能只是按字母順序?qū)?i 更改為 j )。如果理解為對(duì)數(shù)字實(shí)體的操作,那么情況就變得復(fù)雜了:它會(huì)創(chuàng)建一個(gè)新的一等公民 1001,因此需要為其分配內(nèi)存地址。此時(shí)如果占用1000 的地址,就涉及到舊對(duì)象的回收,所有已經(jīng)存在的與1000的引用關(guān)系都會(huì)受到影響。因此,只有分配新的內(nèi)存空間才能給出1001。
如果 python 支持 i++,它的運(yùn)算過(guò)程會(huì)比 C 的 i++ 更復(fù)雜,其含義將不再是 “將數(shù)字增加1”(增量),而是“創(chuàng)建一個(gè)新數(shù)字”(加法)。在這種情況下,“增量運(yùn)算符” 就不再名副其實(shí)了。
Python 理論上可以實(shí)現(xiàn) i++ 的操作,但是接下來(lái)它必須重新定義“自增運(yùn)算符”,這可能會(huì)給有其他語(yǔ)言經(jīng)驗(yàn)的人造成誤解。大家最好直接寫(xiě)成 i+=1 或者 i=i+1。
Python 有可迭代對(duì)象
在 C/C++ 等語(yǔ)言中設(shè)計(jì) i++ 的主要目的是方便使用 for循環(huán)。
for(int i = 0; i < 100; i++){ // 執(zhí)行 xxx }
該程序涉及數(shù)字的自增過(guò)程,其中數(shù)字的加法與程序體的執(zhí)行相關(guān)聯(lián)。
python 沒(méi)有這種結(jié)構(gòu)語(yǔ)法。相反,它提供了一種更優(yōu)雅的方式:
for i in range(100): # 執(zhí)行 xxx my_list = ["Hello", "I'm boleo", "Please follow me!"] for info in my_list: print(info)
這體現(xiàn)了不同的思維方式。它關(guān)注的是在數(shù)值范圍內(nèi)迭代,不需要也不關(guān)心手動(dòng)添加數(shù)字。
Python 的可迭代對(duì)象/迭代器/生成器提供了非常好的迭代/遍歷用法,可以完全替代 i++。
例如,在上面的示例中,它實(shí)現(xiàn)了列表內(nèi)值的遍歷。Python 還可以使用 enumerate() 同時(shí)遍歷索引和特定值。
my_list = ["Hello", "I'm boleo", "Please follow me!"] for i, info in enumerate(my_list): print(i, info)
比如對(duì)于字典的遍歷,python 提供了 keys()、values()、items() 等方法,非常有用。
my_dict = {'a': '1', 'b': '2', 'c': '3'} for key in my_dict.keys(): print(key) for key, value in my_dict.items(): print(key, value)
總之,Python 不支持增量運(yùn)算符,因?yàn)樗恼麛?shù)是不可變的一等公民。支持增量運(yùn)算 (++) 會(huì)帶來(lái)歧義。此外,它還有更合適的實(shí)現(xiàn),例如可迭代對(duì)象,為遍歷操作提供了良好的支持。
以上就是python不支持i++運(yùn)算原理實(shí)例解析的詳細(xì)內(nèi)容,更多關(guān)于python不支持 i++運(yùn)算的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python pandas之求和運(yùn)算和非空值個(gè)數(shù)統(tǒng)計(jì)
數(shù)據(jù)處理的過(guò)程中經(jīng)常會(huì)遇到判斷空值和求和運(yùn)算的需求,所以下面這篇文章主要給大家介紹了關(guān)于Python pandas之求和運(yùn)算和非空值個(gè)數(shù)統(tǒng)計(jì)的相關(guān)資料,需要的朋友可以參考下2021-08-08Python實(shí)現(xiàn)i人事自動(dòng)打卡的示例代碼
這篇文章主要介紹了Python實(shí)現(xiàn)i人事自動(dòng)打卡的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01python實(shí)現(xiàn)逐個(gè)讀取txt字符并修改
今天小編就為大家分享一篇python實(shí)現(xiàn)逐個(gè)讀取txt字符并修改,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12pip install 使用國(guó)內(nèi)鏡像的方法示例
這篇文章主要介紹了pip install 使用國(guó)內(nèi)鏡像的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04PyTorch?Dataset與DataLoader使用超詳細(xì)講解
用于處理數(shù)據(jù)樣本的代碼可能會(huì)變得凌亂且難以維護(hù);理想情況下,我們希望數(shù)據(jù)集代碼與模型訓(xùn)練代碼解耦,以獲得更好的可讀性和模塊化。PyTorch提供的torch.utils.data.DataLoader和torch.utils.data.Dataset允許你使用預(yù)下載的數(shù)據(jù)集或自己制作的數(shù)據(jù)2022-10-10日常整理python執(zhí)行系統(tǒng)命令的常見(jiàn)方法(全)
本文是小編日常整理的些關(guān)于python執(zhí)行系統(tǒng)命令常見(jiàn)的方法,比較全面,特此通過(guò)腳本之家這個(gè)平臺(tái)把此篇文章分享給大家供大家參考2015-10-10python多進(jìn)程登錄遠(yuǎn)端服務(wù)器
這篇文章主要介紹了python多進(jìn)程登錄遠(yuǎn)端服務(wù)器,文章應(yīng)用實(shí)例簡(jiǎn)易的方式詳細(xì)講解python多進(jìn)程登錄遠(yuǎn)端服務(wù)器的相關(guān)資料,需要的朋友可以參考以下文章的具體內(nèi)容2021-10-10Django集成MongoDB實(shí)現(xiàn)過(guò)程解析
這篇文章主要介紹了Django集成MongoDB實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12