成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

python小白,問一個關于可變類型和不可變類型底層的問題

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

問題描述

第一段代碼:

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

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

python小白,問一個關于可變類型和不可變類型底層的問題

第二段代碼:

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

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

python小白,問一個關于可變類型和不可變類型底層的問題

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

問題解答

回答1:

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

static PyObject *string_upper(PyStringObject *self){ char *s; Py_ssize_t i, n = PyString_GET_SIZE(self); # 取出字符串對象中字符串的長度 PyObject *newobj; newobj = PyString_FromStringAndSize(NULL, n); # 可以理解成申請內存空間 if (!newobj)return NULL; s = PyString_AS_STRING(newobj); # 從newobj對象取出具體字符串指針 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); # 修改對應指針位置上的內容 } return newobj; # 返回新字符串對象 (區(qū)分字符串對象和里面字符串的指針)}

這是列表的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); # 因為列表是頭和和成員分開的, 所以直接將新成員追加在原來的成員數(shù)組后面, 長度變化通過resize實現(xiàn) return 0;}回答2:

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

樓主的例子: 

a = a.upper()

a的變量內容已經變化,不一樣了,舊的內容沒有了引用,垃圾回收銷毀對象.b是列表,是可變的,可以再申請內存.同時,b有內容引用,不會被銷毀.

回答3:

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

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

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

回答4:

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

標簽: Python 編程
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产精品亚洲产品| 懂色中文一区二区在线播放| 捆绑紧缚一区二区三区视频| 亚洲成人直播| 欧美国产日韩一二三区| 国产呦精品一区二区三区网站| 亚洲在线播放| 亚洲图片欧美视频| 亚洲激情女人| 国产精品乱码久久久久久| 97国产一区二区| www国产成人| 成人激情开心网| 日韩免费看的电影| 福利91精品一区二区三区| 欧美天堂一区二区三区| 日本在线不卡一区| 久久久天天操| 免费观看一级特黄欧美大片| 91国内精品野花午夜精品| 亚洲国产美国国产综合一区二区| 在线亚洲观看| 亚洲黄色片在线观看| 99国产成+人+综合+亚洲欧美| 亚洲欧美偷拍卡通变态| 亚洲激情婷婷| 亚洲精品菠萝久久久久久久| 99国产精品私拍| 亚洲v精品v日韩v欧美v专区 | 亚洲欧美电影在线观看| 亚洲二区视频在线| 91黄色小视频| 精一区二区三区| 欧美日韩一区二区三区在线看| 精品在线观看免费| 日韩一区二区三区在线| eeuss国产一区二区三区| 国产欧美日韩激情| 亚洲免费播放| 午夜视频在线观看一区二区三区| 色噜噜久久综合| 精品在线视频一区| 欧美大黄免费观看| 国产精品xvideos88| 中文字幕在线观看不卡| 亚洲一区二区三区高清不卡| 三级一区在线视频先锋| 欧美日韩精品是欧美日韩精品| 国产精品亚洲一区二区三区妖精 | 国产农村妇女精品一区二区| 日韩黄色一级片| 在线综合亚洲欧美在线视频| 91亚洲国产成人精品一区二三| 亚洲欧洲一区二区三区| 久久精品男女| 国产精品综合久久| 久久婷婷久久一区二区三区| 91久久极品少妇xxxxⅹ软件| 亚洲不卡在线观看| 91麻豆精品久久久久蜜臀| 91麻豆蜜桃一区二区三区| 最新欧美精品一区二区三区| 一本一道久久a久久精品| 国产精品亚洲第一区在线暖暖韩国| 久久综合精品国产一区二区三区| 一区一区视频| 日韩中文字幕区一区有砖一区| 欧美一区二区三区在线看| 欧美激情 亚洲a∨综合| 亚洲一区二区在线免费看| 欧美日韩国产综合草草| 欧美激情成人在线| 五月婷婷欧美视频| 在线不卡中文字幕播放| 欧美日韩三区| 午夜av区久久| 欧美xxxxx裸体时装秀| 亚洲欧洲另类| 久国产精品韩国三级视频| 国产亚洲欧美日韩俺去了| 亚洲一区精品视频| 国产福利一区在线观看| 亚洲欧洲三级电影| 欧美高清视频不卡网| 亚洲高清网站| 国产一区二区三区免费| 中文一区二区在线观看| 欧美又粗又大又爽| 欧美成人69av| 欧美aaa在线| 国产欧美精品区一区二区三区| 久久综合影音| 欧美日韩亚洲一区二区三区在线| 美女视频免费一区| 国产精品欧美极品| 7878成人国产在线观看| 国产亚洲在线| aaa欧美日韩| 美女免费视频一区二区| 亚洲色图欧洲色图婷婷| 日韩一区二区在线看| aa成人免费视频| 国产aⅴ综合色| 亚洲欧美成人一区二区三区| 日韩一本二本av| 久久亚洲美女| 亚洲午夜久久久久久尤物| 成人性生交大片免费看中文| 日韩精品一二区| 国产精品国产精品国产专区不蜜| 欧美精品自拍偷拍动漫精品| 国产精品一级| 91蝌蚪porny| 国产呦萝稀缺另类资源| 亚洲国产欧美日韩另类综合| 久久精品人人做人人综合| 欧美午夜精品电影| 国产精品一二| 你懂的一区二区| 国产在线乱码一区二区三区| 亚洲综合视频网| 国产丝袜欧美中文另类| 欧美精品一二三区| 美女黄网久久| 国精品一区二区| 国产成人av一区二区三区在线 | 日韩在线卡一卡二| 中文字幕综合网| 久久精品视频免费| 欧美一区二区免费观在线| 日本韩国一区二区三区| 国产亚洲福利| 国产精品分类| 成人av资源在线| 国产精品一级在线| 麻豆视频一区二区| 丝袜美腿亚洲色图| 亚洲乱码精品一二三四区日韩在线| 国产校园另类小说区| 日韩亚洲欧美中文三级| 欧美日韩一区二区三区在线| 免费亚洲电影| 国产精品入口麻豆原神| 精品国产伦理网| 日韩一区二区电影| 欧美人与禽zozo性伦| 一本大道综合伊人精品热热| 99香蕉国产精品偷在线观看 | 国产精品69久久久久水密桃| 蜜桃传媒麻豆第一区在线观看| 亚洲午夜电影在线观看| 亚洲欧美色一区| 国产精品色哟哟网站| 久久久91精品国产一区二区精品| 日韩一级二级三级| 欧美狂野另类xxxxoooo| 欧美视频精品在线观看| 玖玖精品视频| 亚洲欧美日韩视频二区| 国产欧美日本| 一本久道综合久久精品| 一本色道久久综合一区| 最近看过的日韩成人| 在线免费观看欧美| 极品中文字幕一区| 欧美三级黄美女| 欧美精品七区| 国产综合自拍| 亚洲电影自拍| 一区二区福利| 亚洲福利一区| 国产亚洲一区二区三区在线播放| 99pao成人国产永久免费视频| 亚洲裸体视频| aⅴ色国产欧美| 亚洲欧美卡通另类91av| 久久国产主播精品| 日本乱人伦一区| 欧美视频在线一区| 91精品国模一区二区三区| 91麻豆精品国产91久久久久| 欧美一级日韩不卡播放免费| 日韩欧美一区电影| 精品国一区二区三区| 久久久久久久久久久久久久久99| 久久综合九色综合97婷婷| 欧美高清在线精品一区| 日韩理论片一区二区| 一区二区三区在线看| 视频一区中文字幕| 国产中文字幕一区| av影院午夜一区| 国产精品swag| 香蕉久久a毛片| 欧美午夜精品一区二区三区| 欧美久久一二三四区| 欧美电视剧免费全集观看| 国产婷婷色一区二区三区四区| 中文字幕欧美一| 亚洲尤物视频在线|