python中垃圾回收機制_Python中的變量和垃圾回收機制

1、python中的變量

python

java

中的變量本質不一樣。

java

中聲明變量時要指定變量的數據類型,int、str或某一類,之后虛擬機就會在內存中申請一塊空間,空間的大小跟類型相關。通俗的理解就是把變量想象成一個盒子,盒子里能裝什么東西,一開始就設定了。

比如

a=1

就是將1放到盒子里面。

python

的變量實質是一個指針,指針的大小都是一樣的。比如一個指向int類型的指針,指針本身大小是固定的,也不用考慮int本身所占的內存大小,反正是放在內存中。在訪問int對象時只需要找到指針即可。

a=1

來說,首先去內存中聲明一個int類型對象,開辟一塊空間用來存儲1,然后將a指向1。

a = [1,2,3]

b = a

b.append(4)

print(a) # [1,2,3,4]

這里如果用盒子的思想去理解的話:將列表

[1,2,3]

放進一個盒子中,再將a放另一個盒子中,那么修改b之后打印a的話,a就不會發生改變。

a = [1,2,3]

b = a

print(a is b) # True

通過

is

也可看到

a

b

是同一個對象,也就是

a

指向的對象

id

值和

b

指向的對象

id

值相同。

2、==和is的區別

is

上邊最后說了

a = [1,2,3] b = a

這樣a和b是同一個對象。那么如果是兩個賦值呢?

a = [1,2,3]

b = [1,2,3]

ptint(a is b) # False

print(id(a) == id(b)) #False

從結果來看,此時的a和b是不同的對象。也就是說在使用賦值語句時會重新聲明一個對象。

有一個特殊情況如下

a = 1

b = 1

print(a is b) #True

python

內部的

intern

機制——遇到相同的一定范圍內的小整數時不在生成新的對象,直接指向原來的那個對象。一種內部優化的機制。

小段字符串也是一樣的。

a = "abc"

b = "abc"

print(a is b) #True

用is對類進行判斷

class People:

pass

person = People()

# isinstance(person,People)

if type(person) is People:

print('Yes') # Yes

因為類本身也是一個對象,而且是全局唯一的對象,

person

實際上是指向

People

的,所以

type(person)

People

的id是一樣的。

==

a = [1,2,3]

b = [1,2,3]

ptint(a == b) # True

a是一個list類型的對象,list中實現了一個魔法函數

__eq__

,當遇到==時就會調用該函數判斷對象的值是否相等。

3、del語句和垃圾回收機制

python

中的垃圾回收算法采用的是引用計數。

先定義

a=1

b=a

,然后1這個對象上就會自動生成一個計數器,

a=1

時計數器會加1,

b=a

說明b也指向了a,此時計數器再加1,相當于1上面有兩個變量指向它。

當我們使用

del a

刪除對象時,計數器則會減1。當計數器減少到0時,python解釋器就會將對象回收(不能一直占用在內存中)。

c++中的刪除語句是直接將對象回收,這和python不一樣。

舉個栗子

a=object()

b=a

del a

print(b) # object object at 0x0000000003D90F0

print(a) # name a is not defined

上面的結果就是b能打印出來,a打印不出來。過程就是將對象a刪掉,同時將引用計數器減1。

python

解釋器回收對象時,會去調用對象的

__del__

魔法函數。所以當我們做垃圾回收時,希望某些資源在對象被回收時釋放,就可以通過重載

__del__

函數來實現。

class A:

def __del__(self):

pass

4、關于傳入列表的一下注意事項

第一種情況

def add(a,b):

a+=b

return a

if __name__ == "__main__":

a = 1

b = 2

c=add(a,b)

print(c) # 3

print(a,b) # 1 2

第二種情況

def add(a,b):

a+=b

return a

if __name__ == "__main__":

a = [1,2]

b = [3,4]

c=add(a,b)

print(c) # [1,2,3,4]

print(a,b) # [1,2,3,4] [3,4]

發現此時輸入的a改變了,因為列表是可變類型,+=符號在運行過程中直接賦值給原前的列表變量a,所以原來的a發生了改變。

第三種情況

def add(a,b):

a+=b

return a

if __name__ == "__main__":

a = (1,2)

b = (3,4)

c=add(a,b)

print(c) # (1,2,3,4)

print(a,b) # (1,2) (3,4)

總結

三種不同類型參數傳遞進來的時候,只有列表對象對原數據產生了影響。

所以當傳遞一個對象到函數中,對象如果是

list、dict

這類的值可被修改的類型,可能會引起原始數據的改變。

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

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

相關文章

戴爾電腦好還是華為好_華碩和戴爾筆記本哪種好 華碩和戴爾優缺點分析【詳解】...

隨著時代快速的發展,筆記本電腦已經成了我們生活中的標配。如今,市面上筆記本電腦的款式眾多,相信大家對華碩和戴爾并不陌生吧!那么,我們該怎么去選擇呢?今天小編就給大家介紹華碩和戴爾筆記本哪個好&#…

php檢查 session是否存在,檢查sessionid已知的PHP會話是否處于活動狀態

實際上,您可以將session_id和session_start用于此目的.$ids [135b29ef958a23418f2a804474787305, // active session135b29ef958a23418f2a804474787306, // inactive session135b29ef958a23418f2a804474787305, // active session];foreach($ids as $id){session_id($id);sess…

c++ python混合編程 restful_簡單上手nodejs調用c++(c++和js的混合編程)

因為項目的原因,最近經常使用node.js搭RESTful接口。性能還是很不錯啦,感覺比Spring Boot之類的要快。而且在不錯的性能之外,只要程序結構組織好,別讓太多的回調把程序結構搞亂,整體開發效率比Java快的就太多了。如果想…

電腦掃描二維碼_線上分享 | 網絡工作坊:平板電腦工作術

澳門生產力暨科技轉移中心將于9月29日下午3時,舉辦資訊科技工具應用線上工作坊,講解平板電腦辦公應用,歡迎有興趣人士報名,名額有限,先到先得。該中心早前已舉辦是次主題的應用工作坊,坊間反應積極&#xf…

java bean 轉json 串,終于找到了一篇能看懂的如何把javabean轉換成json字符串的文章,嘿嘿,分享一下!...

學會了在j2ee中使用ajax后,有時候從服務器返回客戶端的數據是對象,自己手動拼湊json字符串容易出錯,通過谷歌知道了json-lib這個類庫,方便的支持java中對象到json字符串的轉化。看source-forge的json-lib介紹說,需要jakarta commo…

數據庫設置_CentOS7 - 設置MySQL數據庫

設置MySQL數據庫本文介紹如何在CentOS上執行流行的MySQL數據庫服務器的基本安裝。 MySQL是當今使用最廣泛的數據庫系統,它可以在許多不同的行業中找到,為動態網站和大型數據倉庫等各種產品提供數據存儲。準備此配方要求CentOS系統具有有效的網絡連接和管…

提出離職后怎么定last day_不管你因為什么離職,用正規的離職方式是你最正確的選擇!...

#不管你是因為什么離職,用正規的離職方式離職是你最正確的選擇,如果因為不恰當的方式造成與公司的矛盾,可能讓你今后會非常被動。書面離職是最具有法律效力的,按照勞動法,你有權在提出正式離職一個月后走人&#xff0c…

mqtt php 16進制數據,phpMQTT 內存耗死問題

場景:(訂閱)鏈接不上mqtt的時候,一下代碼會出錯:function read($int 8192, $nb false){// print_r(socket_get_status($this->socket));$string"";$togo $int;if($nb){return fread($this->socket, $togo);}// var_dump($this->so…

人臉識別代碼_10行代碼實現人臉識別

什么是人臉識別人臉識別,是基于人的臉部特征信息進行身份識別的一種生物識別技術。用攝像機或攝像頭采集含有人臉的圖像或視頻流,并自動在圖像中檢測和跟蹤人臉,進而對檢測到的人臉進行臉部識別的一系列相關技術,通常也叫做人像識…

ticketvalidationexception票根不符合目標服務_如何在有效降低企業倉儲成本的同時不降低企業的總體服務質量目標水平?...

對于企業而言,如何降低倉儲成本,同時要保證物流總成本最低和不降低企業的總體服務質量和目標水平的前提下進行,常見的措施有以下幾點:一用“先進先出方式,減少倉儲物的保管風險。”先進先出是儲存管理的準則之一&#…

matlab編程 英文翻譯,MATLAB編程,MATLAB programming,音標,讀音,翻譯,英文例句,英語詞典...

Image:114994698204558.jpgmatlabmatlab是矩陣實驗室(matrix laboratory)之意。除具備卓越的數值計算能力外,它還提供了專業水平的符號計算,文字處理,可視化建模仿真和實時控制等功能。matlab的基本數據單位是矩陣,它的指令表達式…

python進群_Manim-python 進群問題之解答

事情起因人閑下來的時候總想找點事情做!這不,昨天考完試后在B站上逛,不小心進入了學習區,在00后學長那里看到了一個視頻。鏈接如下:具有美感的傅里葉級數居然還能夠畫畫!!!這讓我一個…

python科學計算_可視化圖解Python科學計算包NumPy

NumPy包是python生態系統中數據分析、機器學習和科學計算的主力。 它極大地簡化了向量和矩陣的操作。Python的一些主要軟件包依賴于NumPy作為其基礎架構的基礎部分(例如scikit-learn、SciPy、pandas和tensorflow)。我們將介紹一些使用NumPy的主要方法&am…

php 導出excel 特殊字符,PHPEXCEL導出,存在特殊字符遇到的問題

[13] > Array([payment_success_at] >[user_name] > ?.琳琳?[remarks] >[product_name] > 香菇[sku_name] > 斤[product_property] > 斤[price_original] > 5.50[price_current] > 5.50[consignee] > ?.琳琳?)以上代碼中用戶名中存在特殊符號…

win10任務欄怎么還原到下面_詳解:新版 WIN 10 V2004 任務欄和開始菜單全透明

是不是很酷炫?繼續往下看,你也可以簡單做到導語本文將告訴你如何借助一個小工具,將最新版 WIN 10 開始菜單和任務欄設置成全透明,以獲得超酷的視覺體驗。安裝和設置都很簡單,關鍵是一定要找到適合 WIN 10 版本的 Start…

php是靜態語言,Thinkphp靜態緩存多語言切換

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓1.首先判斷用戶有無手動指定語言2.從session中獲得當前語言3.session里面沒有則從cookie里面去取4.若是cookie里沒有,則根據IP段判斷5.若不在指定ip范圍內,自動偵測瀏覽器語言首先我們在Common/Conf/tags.ph…

10.8.8.8檸檬wifi網頁登錄_基于企業郵箱進行wifi實名認證的方案

之前我們介紹過如何用釘釘認證和企業微信認證來實現企業內部的實名上網認證。此外郵箱認證也是企業進行wifi實名認證的一個有效手段。因為很多企業都給員工開通了企業郵箱,直接讓員工輸入郵箱賬號和密碼進行認證上網。配置、使用和維護都相對比較簡單。本文我將介紹…

用pycharm寫python老是提示錯誤_python pycharm錯誤集錦

url:http://www.cnblogs.com/hinimix/p/8016859.html1, this list creation could be rewritten as a list literal預先定義了一個listlist1 [1,2,3,4] #這么用好比list1 [1,2,3] #這么用不好list1.append(4)此時會出現該提示解決鏈接:https://stackoverflow.com/…

php tire樹,Immutable.js源碼之List 類型的詳細解析(附示例)

本篇文章給大家帶來的內容是關于Immutable.js源碼之List 類型的詳細解析(附示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。一、存儲圖解我以下面這段代碼為例子,畫出這個List的存儲結構:let myL…

nodejs missing script: dev_nodejs深入學習系列之v8基礎篇

V8這個概念大家都不陌生了,那么你動手編譯過V8源碼嗎?編譯后有嘗試去了解V8背后的一些概念嗎?如果沒有,那么也不用心慌,下文將跟大家一一解釋這些東西。在編譯V8之前我們先要了解一個東西-構建系統1、構建系統1.1、構建…