亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

python小白,問(wèn)一個(gè)關(guān)于可變類型和不可變類型底層的問(wèn)題

瀏覽:83日期:2022-06-29 16:59:43

問(wèn)題描述

第一段代碼:

a = 'hello' #定義一個(gè)字符串的變量print(id(a)) #第一次的地址print(a) #a = helloa = a.upper() # 單純的a.upper() 執(zhí)行過(guò)后,無(wú)法存儲(chǔ)到a本身,必須得重新賦值給a 換句話說(shuō),a在被upper之后,重新指向了一個(gè)新的地址print(id(a)) #第二次的地址print(a)

第一段代碼執(zhí)行結(jié)果:

python小白,問(wèn)一個(gè)關(guān)于可變類型和不可變類型底層的問(wèn)題

第二段代碼:

b = [11,22,33,44,55] #定義一個(gè)列表的變量print(id(b)) #第一次的地址print(b) #b = [11,22,33,44,55]b.append(99) #單純的b.append()執(zhí)行過(guò)后,不需要存儲(chǔ)到b,因?yàn)閎已經(jīng)被更改print(id(b)) #檢查第一次的地址print(b) #發(fā)現(xiàn)在第一次地址當(dāng)中,b已經(jīng)改變#b = b.append(99) #如果將修改b這個(gè)行為賦值到b#print(id(b)) #檢查地址,發(fā)現(xiàn)已經(jīng)變更#print(b) #檢查b的值,發(fā)現(xiàn)已經(jīng)變更。b的值為none 因?yàn)閎.append(99)本身的返回值為none#[***列表為可修改變量,因此修改完之后,地址跟原來(lái)的一樣。反而是如果像修改字符串那樣重新賦值,變得不可行。原因在于append語(yǔ)句本身并不返回值。***]#字符串賦值之后放在內(nèi)存一個(gè)地址,這個(gè)地址上面的字符串是無(wú)法更改的,只能重新做一個(gè)新的字符串,然后改變變量的指向位置。#而列表賦值之后存在一個(gè)內(nèi)存的地址,這個(gè)列表里面的值是可以直接修改的。不需要重新做一個(gè)新的列表,然后改變變量的指向位置。

第二段代碼執(zhí)行結(jié)果:

python小白,問(wèn)一個(gè)關(guān)于可變類型和不可變類型底層的問(wèn)題

在學(xué)python的過(guò)程當(dāng)中被告知,字符串是屬于不可變類型,列表屬于可變類型。也就是說(shuō),如果我要改字符串,我其實(shí)是重新做了一個(gè)新的字符串,放在內(nèi)存的新的地址中,原來(lái)的地方那個(gè)字符串還是原來(lái)的老樣子。如第一段代碼所示。而列表不一樣,列表可以在原來(lái)的內(nèi)存地址上直接修改。如第二段代碼所示。我的問(wèn)題:可變類型和不可變類型的根本區(qū)別在哪里?為什么會(huì)出現(xiàn)這種區(qū)別?為什么第一段代碼里,a要想改變,必須改變地址,第二段代碼里b可以不變地址的情況下直接修改列表的值。這里面的底層邏輯是什么?我猜想,是不是意味著列表這個(gè)東西本身,也其實(shí)是某一個(gè)一堆值得集合體,它僅僅只是反映了一個(gè)集合體本身,把一堆值指向了這一個(gè)地方而已,所以才是可以修改的?不知道我表達(dá)有沒(méi)有清楚。我只是對(duì)這個(gè)東西很好奇,也就是說(shuō),追根究底列表到底是個(gè)什么東西,為什么他是可以直接改的?而字符串沒(méi)法改。往再底層深入之后,他們倆到底是啥?

問(wèn)題解答

回答1:

其實(shí)對(duì)象可變不可變, 對(duì)py, 都是內(nèi)部實(shí)現(xiàn)的問(wèn)題, 如果我修改相應(yīng)的方法, 將其寫回到本身, 這樣也能模仿出可變的現(xiàn)象, 就小小類似tuple和list的關(guān)系,既然想了解底層, 那就直接看源碼吧:這是字符串的upper()

static PyObject *string_upper(PyStringObject *self){ char *s; Py_ssize_t i, n = PyString_GET_SIZE(self); # 取出字符串對(duì)象中字符串的長(zhǎng)度 PyObject *newobj; newobj = PyString_FromStringAndSize(NULL, n); # 可以理解成申請(qǐng)內(nèi)存空間 if (!newobj)return NULL; s = PyString_AS_STRING(newobj); # 從newobj對(duì)象取出具體字符串指針 Py_MEMCPY(s, PyString_AS_STRING(self), n); # 拷貝舊的字符串 for (i = 0; i < n; i++) {int c = Py_CHARMASK(s[i]);if (islower(c)) s[i] = _toupper(c); # 修改對(duì)應(yīng)指針位置上的內(nèi)容 } return newobj; # 返回新字符串對(duì)象 (區(qū)分字符串對(duì)象和里面字符串的指針)}

這是列表的append

intPyList_Append(PyObject *op, PyObject *newitem){ if (PyList_Check(op) && (newitem != NULL))return app1((PyListObject *)op, newitem); PyErr_BadInternalCall(); return -1;}static intapp1(PyListObject *self, PyObject *v){ Py_ssize_t n = PyList_GET_SIZE(self); assert (v != NULL); if (n == PY_SSIZE_T_MAX) {PyErr_SetString(PyExc_OverflowError, 'cannot add more objects to list');return -1; } if (list_resize(self, n+1) == -1)return -1; Py_INCREF(v); PyList_SET_ITEM(self, n, v); # 因?yàn)榱斜硎穷^和和成員分開(kāi)的, 所以直接將新成員追加在原來(lái)的成員數(shù)組后面, 長(zhǎng)度變化通過(guò)resize實(shí)現(xiàn) return 0;}回答2:

python字符串有cache的,如果兩個(gè)相同的字符串在不同的變量a,b,他們的id(a), id(b)是一樣的.但如果當(dāng)a, b的引用為0是,就會(huì)自動(dòng)銷毀對(duì)象.

樓主的例子: 

a = a.upper()

a的變量?jī)?nèi)容已經(jīng)變化,不一樣了,舊的內(nèi)容沒(méi)有了引用,垃圾回收銷毀對(duì)象.b是列表,是可變的,可以再申請(qǐng)內(nèi)存.同時(shí),b有內(nèi)容引用,不會(huì)被銷毀.

回答3:

往再底層深入,就去看python的C源碼唄~

可不可變,是python語(yǔ)言規(guī)定的。

不可變類型 沒(méi)有提供修改對(duì)象自身的方法,而 可變類型 提供了這些方法。就這些差別,沒(méi)啥神秘的。

回答4:

從硬件角度說(shuō),提供給用戶的接口是按照規(guī)定設(shè)定好的,操作內(nèi)存就是固定的方式,不存在可變和不可變。往上,就是操作系統(tǒng)層,對(duì)硬件api進(jìn)行了大量的封裝,使用戶操作變得豐富,對(duì)于python解釋器是使用c語(yǔ)言編寫的,使用python時(shí)只是使用了python的語(yǔ)用,編寫代碼,然后交給解釋器去執(zhí)行.在上面的前提下,來(lái)解釋當(dāng)前問(wèn)題,python的可變和不可變是python創(chuàng)建者規(guī)定的,實(shí)現(xiàn)這些規(guī)定的方式可能就是調(diào)用了不同的底層api,或者是不同底層api相互組合來(lái)實(shí)現(xiàn)的。將這些規(guī)定以python語(yǔ)用的形式提供給用戶使用,最后還是編譯成0,1去讓計(jì)算機(jī)執(zhí)行。對(duì)于用戶來(lái)說(shuō),可變和不可變對(duì)象是語(yǔ)言提供的一個(gè)特性,可以完成一些功能,但是對(duì)于計(jì)算機(jī)其實(shí)是沒(méi)區(qū)別的。

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 永久免费观看黄网站 | 欧美v在线 | 日韩免费一级a毛片在线播放一级 | 天天在线天天看成人免费视频 | 青青免费视频在线 | 亚洲国产精品一区二区三区在线观看 | 亚洲国产精品a一区二区三区 | 欧美中文日韩 | 娇小性色xxxxx | 全免费观看a级毛片 | 青青草 久久久 | 亚洲tv精品一区二区三区 | 国产精品色午夜视频免费看 | 成人看的午夜免费毛片 | 午夜社区 | 亚洲精国产一区二区三区 | 成人精品视频一区二区在线 | 成年人午夜网站 | 国产丰满美女做爰 | 亚洲在线小视频 | 在线视频不卡国产在线视频不卡 | japanese色国产在线看视频 | 91精品国产露脸在线观看 | 一级做性色a爰片久久毛片 一级做性色a爰片久久毛片免费 | 成人满18在线观看网站免费 | 久草网在线视频 | 国产一级特黄特色aa毛片 | 欧美日韩亚洲精品一区二区三区 | a级成人毛片久久 | 1区1区3区4区产品亚洲 | 99re最新地址| 一级无遮挡理论片 | 亚洲国产一区二区三区 | 麻豆视频网站在线观看 | 亚洲狠狠婷婷综合久久久久网站 | 91精品国产爱久久久久久 | 久草a视频 | 免费一级视频在线播放 | 99久久精品自在自看国产 | 国产三级毛片 | 一本一本大道香蕉久在线精品 |