老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

python函數存放在棧,python的棧

python中的堆棧什么意思

堆棧是一種執行“后進先出”算法的數據結構。

創新互聯堅持“要么做到,要么別承諾”的工作理念,服務領域包括:成都做網站、網站制作、企業官網、英文網站、手機端網站、網站推廣等服務,滿足客戶于互聯網時代的壺關網站設計、移動媒體設計的需求,幫助企業找到有效的互聯網解決方案。努力成為您成熟可靠的網絡建設合作伙伴!

設想有一個直徑不大、一端開口一端封閉的竹筒。有若干個寫有編號的小球,小球的直徑比竹筒的直徑略小。現在把不同編號的小球放到

竹筒里面,可以發現一種規律:先放進去的小球只能后拿出來,反之,后放進去的小球能夠先拿出來。所以“先進后出”就是這種結構的

特點。

堆棧是計算機中最常用的一種數據結構,比如函數的調用在計算機中是用堆棧實現的。 堆棧可以用數組存儲,也可以用以后會介紹的鏈

表存儲。

堆棧就是這樣一種數據結構。它是在內存中開辟一個存儲區域,數據一個一個順序地存入(也就是“壓入——push”)這個區域之中。

有一個地址指針總指向最后一個壓入堆棧的數據所在的數據單元,存放這個地址指針的寄存器就叫做堆棧指示器。開始放入數據的單元叫

做“棧底”。數據一個一個地存入,這個過程叫做“壓棧”。在壓棧的過程中,每有一個數據壓入堆棧,就放在和前一個單元相連的后面

一個單元中,堆棧指示器中的地址自動加1。讀取這些數據時,按照堆棧指示器中的地址讀取數據,堆棧指示器中的地址數自動減 1。這

個過程叫做“彈出pop”。如此就實現了后進先出的原則。

推薦學習《python教程》。

python堆和棧的區別有哪些

堆(Heap)與棧(Stack)是開發人員必須面對的兩個概念,在理解這兩個概念時,需要放到具體的場景下,因為不同場景下,堆與棧代表不同的含義。一般情況下,有兩層含義:

(1)程序內存布局場景下,堆與棧表示的是兩種內存管理方式;

(2)數據結構場景下,堆與棧表示兩種常用的數據結構。

相關推薦:《Python教程》

堆與棧實際上是操作系統對進程占用的內存空間的兩種管理方式,主要有如下幾種區別:

(1)管理方式不同。棧由操作系統自動分配釋放,無需我們手動控制;堆的申請和釋放工作由程序員控制,容易產生內存泄漏;

(2)空間大小不同。每個進程擁有的棧的大小要遠遠小于堆的大小。理論上,程序員可申請的堆大小為虛擬內存的大小,進程棧的大小 64bits 的 Windows 默認 1MB,64bits 的 Linux 默認 10MB;

(3)生長方向不同。堆的生長方向向上,內存地址由低到高;棧的生長方向向下,內存地址由高到低。

(4)分配方式不同。堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態分配。靜態分配是由操作系統完成的,比如局部變量的分配。動態分配由alloca函數進行分配,但是棧的動態分配和堆是不同的,他的動態分配是由操作系統進行釋放,無需我們手工實現。

(5)分配效率不同。棧由操作系統自動分配,會在硬件層級對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。堆則是由C/C++提供的庫函數或運算符來完成申請與管理,實現機制較為復雜,頻繁的內存申請容易產生內存碎片。顯然,堆的效率比棧要低得多。

(6)存放內容不同。棧存放的內容,函數返回地址、相關參數、局部變量和寄存器內容等。當主函數調用另外一個函數的時候,要對當前函數執行斷點進行保存,需要使用棧來實現,首先入棧的是主函數下一條語句的地址,即擴展指針寄存器的內容(EIP),然后是當前棧幀的底部地址,即擴展基址指針寄存器內容(EBP),再然后是被調函數的實參等,一般情況下是按照從右向左的順序入棧,之后是被調函數的局部變量,注意靜態變量是存放在數據段或者BSS段,是不入棧的。出棧的順序正好相反,最終棧頂指向主函數下一條語句的地址,主程序又從該地址開始執行。堆,一般情況堆頂使用一個字節的空間來存放堆的大小,而堆中具體存放內容是由程序員來填充的。

從以上可以看到,堆和棧相比,由于大量malloc()/free()或new/delete的使用,容易造成大量的內存碎片,并且可能引發用戶態和核心態的切換,效率較低。棧相比于堆,在程序中應用較為廣泛,最常見的是函數的調用過程由棧來實現,函數返回地址、EBP、實參和局部變量都采用棧的方式存放。雖然棧有眾多的好處,但是由于和堆相比不是那么靈活,有時候分配大量的內存空間,主要還是用堆。

無論是堆還是棧,在內存使用時都要防止非法越界,越界導致的非法內存訪問可能會摧毀程序的堆、棧數據,輕則導致程序運行處于不確定狀態,獲取不到預期結果,重則導致程序異常崩潰,這些都是我們編程時與內存打交道時應該注意的問題。

python中,任何傳入的參數都會以副本的形式存在于函數中嘛?這句話對嗎?

可以這么說。實際上參數是存放在屬于函數的棧里面。函數運行完成,釋放占用的棧。

Python語言如何實現包含min函數的棧

僅供參考

# coding=utf8

'''

題目:定義棧的數據結構,請在該類型中實現一個能夠得到棧的最小元素的min函數。

在該棧中,調用min、push及pop的時間復雜度都是O(1)。

'''

class Stack():

def __init__(self):

self.main_stack = []

# 輔助棧,每次次最小的元素壓入輔助棧

self.assist_stack = []

# 記錄棧中的最小元素

self._min = None

def min(self):

return self._min

def push(self, data):

self.main_stack.append(data)

if self._min is None:

self._min = data

else:

if data self._min:

self._min = data

# 將最小的元素壓入輔助棧

self.assist_stack.append(self._min)

def pop(self):

if len(self.main_stack) == 0:

raise Exception('no data')

elif len(self.main_stack) == 1:

self.assist_stack.pop()

self._min = None

return self.main_stack.pop()

else:

self.assist_stack.pop()

self._min = self.assist_stack[-1]

return self.main_stack.pop()

if __name__ == '__main__':

s = Stack()

s.push(3)

s.push(4)

s.push(2)

s.push(1)

print s.min()

s.pop()

s.pop()

print s.min()

s.pop()

print s.min()

s.pop()

print s.min()

s.pop()

Python對象

眾所周知,Python是一門面向對象的語言,在Python無論是數值、字符串、函數亦或是類型、類,都是對象。

對象是在 堆 上分配的結構,我們定義的所有變量、函數等,都存儲于堆內存,而變量名、函數名則是一個存儲于 棧 中、指向堆中具體結構的引用。

要想深入學習Python,首先需要知道Python對象的定義。

我們通常說的Python都是指CPython,底層由C語言實現,源碼地址: cpython [GitHub]

Python對象的定義位于 Include/object.h ,是一個名為 PyObject 的結構體:

Python中的所有對象都繼承自PyObejct,PyObject包含一個用于垃圾回收的雙向鏈表,一個引用計數變量 ob_refcnt 和 一個類型對象指針 ob_type

從PyObejct的注釋中,我們可以看到這樣一句:每個指向 可變大小Python對象 的指針也可以轉換為 PyVarObject* (可變大小的Python對象會在下文中解釋)。 PyVarObejct 就是在PyObject的基礎上多了一個 ob_size 字段,用于存儲元素個數:

在PyObject結構中,還有一個類型對象指針 ob_type ,用于表示Python對象是什么類型,定義Python對象類型的是一個 PyTypeObject 接口體

實際定義是位于 Include/cpython/object.h 的 _typeobject :

在這個類型對象中,不僅包含了對象的類型,還包含了如分配內存大小、對象標準操作等信息,主要分為:

以Python中的 int類型 為例,int類型對象的定義如下:

從PyObject的定義中我們知道,每個對象的 ob_type 都要指向一個具體的類型對象,比如一個數值型對象 100 ,它的ob_type會指向 int類型對象PyLong_Type 。

PyTypeObject結構體第一行是一個PyObject_VAR_HEAD宏,查看宏定義可知PyTypeObject是一個變長對象

也就是說,歸根結底 類型對象也是一個對象 ,也有ob_type屬性,那 PyLong_Type 的 ob_type 是什么呢?

回到PyLong_Type的定義,第一行 PyVarObject_HEAD_INIT(PyType_Type, 0) ,查看對應的宏定義

由以上關系可以知道, PyVarObject_HEAD_INIT(PyType_Type, 0) = { { _PyObject_EXTRA_INIT 1, PyType_Type } 0} ,將其代入 PyObject_VAR_HEAD ,得到一個變長對象:

這樣看就很明確了,PyLong_Type的類型就是PyType_Typ,同理可知, Python類型對象的類型就是PyType_Type ,而 PyType_Type對象的類型是它本身

從上述內容中,我們知道了對象和對象類型的定義,那么根據定義,對象可以有以下兩種分類

Python對象定義有 PyObject 和 PyVarObject ,因此,根據對象大小是否可變的區別,Python對象可以劃分為 可變對象(變長對象) 和 不可變對象(定長對象)

原本的對象a大小并沒有改變,只是s引用的對象改變了。這里的對象a、對象b就是定長對象

可以看到,變量l仍然指向對象a,只是對象a的內容發生了改變,數據量變大了。這里的對象a就是變長對象

由于存在以上特性,所以使用這兩種對象還會帶來一種區別:

聲明 s2 = s ,修改s的值: s = 'new string' ,s2的值不會一起改變,因為只是s指向了一個新的對象,s2指向的舊對象的值并沒有發生改變

聲明 l2 = l ,修改l的值: l.append(6) ,此時l2的值會一起改變,因為l和l2指向的是同一個對象,而該對象的內容被l修改了

此外,對于 字符串 對象,Python還有一套內存復用機制,如果兩個字符串變量值相同,那它們將共用同一個對象:

對于 數值型 對象,Python會默認創建0~2 8 以內的整數對象,也就是 0 ~ 256 之間的數值對象是共用的:

按照Python數據類型,對象可分為以下幾類:

Python創建對象有兩種方式,泛型API和和類型相關的API

這類API通常以 PyObject_xxx 的形式命名,可以應用在任意Python對象上,如:

使用 PyObjecg_New 創建一個數值型對象:

這類API通常只能作用于一種類型的對象上,如:

使用 PyLong_FromLong 創建一個數值型對象:

在我們使用Python聲明變量的時候,并不需要為變量指派類型,在給變量賦值的時候,可以賦值任意類型數據,如:

從Python對象的定義我們已經可以知曉造成這個特點的原因了,Python創建對象時,會分配內存進行初始化,然后Python內部通過 PyObject* 變量來維護這個對象,所以在Python內部各函數直接傳遞的都是一種泛型指針 PyObject* ,這個指針所指向的對象類型是不固定的,只能通過所指對象的 ob_type 屬性動態進行判斷,而Python正是通過 ob_type 實現了多態機制

Python在管理維護對象時,通過引用計數來判斷內存中的對象是否需要被銷毀,Python中所有事物都是對象,所有對象都有引用計數 ob_refcnt 。

當一個對象的引用計數減少到0之后,Python將會釋放該對象所占用的內存和系統資源。

但這并不意味著最終一定會釋放內存空間,因為頻繁申請釋放內存會大大降低Python的執行效率,因此Python中采用了內存對象池的技術,是的對象釋放的空間會還給內存池,而不是直接釋放,后續需要申請空間時,優先從內存對象池中獲取。


本文名稱:python函數存放在棧,python的棧
網站網址:http://www.xueling.net.cn/article/hsgopo.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 人妻少妇邻居少妇好多水在线 | 午夜毛片免费看20次 | 另类av| 日韩精品一区二区三区老鸭窝 | 美女裸身裸乳视频网站 | 999成人国产 | 女人和公猪交内射网站 | 色视频网站免费观看 | 国产一区二区播放 | 国产精品三区在线观看 | 最新黄色av | 一本大道久久东京热无码av | 538PROM精品视频在线搬运工 | 国产精品久久欧美久久一区 | 中文字幕+乱码+中文字幕无忧 | 美美女高清毛片视频免费观看 | 高清国产福利 | 欧美xxxx日本和非洲 | 精品久久久久久久久久久国产字幕 | 9191久久久久久久久久久 | 国产自偷在线拍精品热 | 精品国产品香蕉在线 | 一级片欧美日韩 | 色九九九九九 | 久久久欧美国产精品人妻噜噜 | 怡红院一区 | 少妇做爰免费视频网站裸体艺术 | 美女高潮在线观看 | 成人乱码| 中国黄色毛片大片 | 成人av影片| 奇米色欧美一区二区三区 | 欧美性猛交99久久久久99 | 欧美日韩亚洲免费 | 少妇高潮惨叫正在播放对白 | 亚洲欧美日韩愉拍自拍 | 国产精品18久久久久久久 | 毛片免费小视频 | 欧美精品一区二区三区在线四季 | 二级大黄大片在线播放 | 国产91精品久久久久久久网曝门 |