1. 程式人生 > >Python學習之路-----小數字快取、字串快取

Python學習之路-----小數字快取、字串快取

快取介紹

         為了增加程式的執行效率,Python3的直譯器中實現了小數字和字串快取的機制,小數字的緩衝範圍是[-5 ~ 256],字串的快取位數預設是20位。在Python程式中每次初始化一個新的變數就會在記憶體中開闢一塊空間來儲存這個變數,當變數不用的時候再回收這塊記憶體。當大量出現這種操作的時候CPU就會發熱,工作效率下降。為了減輕CPU的這種負擔,Python3的直譯器便實現了小數字和字串的快取機制。

演示說明

看下面程式碼,

a = 10 * 10
b = 100
print(id(a),id(b))
a = 10 * 10 * 10
b = 1000
print(id(a),id(b))

結果:
1711073600 1711073600
55698128 55697968

        可以發現執行的結果中第一次a、b的地址一樣,但是第二次的地址就不一樣了。之所以會產生這樣的結果就是因為第一次a計算出的結果屬於[-5 ~ 256]這個快取區間裡,而第二次1000並不在這個區間中。所以會發生第二次a、b的地址不一樣的現象。

字串的預設快取20位,可以看下面的程式碼:

str1 = "0123456789"
str2 = "0123456789"
print(id(str1),id(str2))

str3 = str1 + str2 + "0123456789"
str4 = "012345678901234567890123456789"
print(id(str3),id(str4))


結果:
44300392 44300392
44154456 44154568

預設引數不能使用可變型別資料

看下面的程式碼:

def func(list1 = []):
    #print(id(list1))
    list1.append(3)
    print(list1)

func([1])
func([1])
func()
func()
func()

結果:
[1, 3]
[1, 3]
[3]
[3, 3]
[3, 3, 3]

        不知道與你自己的答案是否一樣呢?如果一樣,恭喜你,對於可變資料型別已經領悟的很好了,不然你可能就還得多理解一下可變資料型別到底是什麼意思!下面解釋一下這個問題。為了方便理解,我把程式碼改成這種形式。去掉輸出值的部分,輸出每個部分的地址。

def func(list1 = []):
    print(id(list1))
    list1.append(3)
    #print(list1)

list2 = [1]
list3 = [1]

print(id(list2))
print(id(list3))
print("+" * 10)
func(list2)
func(list3)
print("-" * 10)
func()
func()
func()

結果:
54524024
54525584
++++++++++
54524024
54525584
----------
20615120
20615120
20615120

        在函式定義list2、list3都是隻有一個元素1,前兩次函式的呼叫就是把list2、list3分別作為函式實參傳遞過去,在函式func中可以發現兩次呼叫的結果:第一次呼叫func函式中輸出的list1的地址與list2一樣,第二次呼叫func函式中輸出的list1的地址與list3一樣。所以他們實際上在記憶體中佔用的不同的記憶體,因此兩次輸出的結果都是[1,3] 。後三次呼叫沒有傳函式實參,因此使用預設的引數,在func函式中發現三次的地址都是一樣的,因此函式每次呼叫list1的就會改變一次。    

    這個例子說明函式的預設引數絕對不能使用可變資料型別,不然的話......,總之這個知識點還是有必要強調一下的。

相關推薦

Python學習-----數字快取字串快取

快取介紹         為了增加程式的執行效率,Python3的直譯器中實現了小數字和字串快取的機制,小數字的緩衝範圍是[-5 ~ 256],字串的快取位數預設是20位。在Python程式中每次初始化一個新的變數就會在記憶體中開闢一塊空間來儲存這個變數,當變數不用的時候再回

python學習08——元組集合

使用 區別 操作 range 成員運算符 index 獲取值 的區別 增加 一. 元組 1、概念 列表:是一種有序的集合 元組和列表的區別: ? a.列表:[] 元組:() ? b.列表中的元素可以進行增加和刪除操作,但是,元組中的元素不能進行修改 ? c.相同點:都是一

python學習-基本資料型別1 變數的概念數字字串

1 什麼是資料型別? 每種程式語言都有自己的資料型別,用於標識計算機可以認識的資料,Python中主要的資料型別為字串,整數,浮點數,列表,元祖,字典,集合七種主要的資料型別,其中以列表,字典為最主要的資料型別。 2 什麼是變數? 在說資料型別之前,首先說一下變數,那什麼是變數?簡單講,變數就是一個容器

python學習(二) -- 函數JSON終端樣式

blog ade def 數量 通過 等於 name tuple args 函數 函數構成 定義函數:使用def即可 def __getName(idCard): return user_info[idCard].Name 其中,__get

Python學習——Python基礎基本資料型別(列表元組和字典)

基本資料型別 數字 字串 列表 list 元組 tuple 字典 dict 布林值 bool 列表和元組 列表:有序,元素可以被修改元組: 書寫格式:元組的一級元素不可被修改,不能被增加或者刪除,一般寫元租的時候,推薦在最後加入',' 索引:v =

Python學習——Python基礎基本數據類型(列表元組和字典)

bre mark 有序 數據 str sca 索引 更新 蘋果 基本數據類型 數字 字符串 列表 list 元組 tuple 字典 dict 布爾值 bool 列表和元組 列表:有序,元素可以被修改元組: 書寫格式:元組的一級元素不可被修改,不能被增加或者刪除,一般寫

python學習===白學程式設計(1)

當我follow一個同事介紹的博主的時候,發現了這個七年前註冊過的部落格賬號。 當時好像在學習c#和mvc的一些東東。 但是回頭看去,不止七年前,更早更早之前,就一直在嘗試著學習程式設計,想掌握一個能夠得心應手的工具。但由於需求並不迫切,加上自己性格使然,斷斷續續的撿起放下,淺嘗輒止的嘗試

python學習===白學程式設計(2)

11月9日 資料庫架構,資料庫設計花的時間有點多,貌似想多了的緣故。 回頭看一下自己的目標,是想通過這個增加對python熟悉程度,提高學習興趣,掌握和了解使用python程式設計的方法。 而實際上至少目前而言自己還是不具備直接考慮程式設計的能力的。所以一切以簡單為主。 那

python學習===白學程式設計(3)

額不找介面,就是懈怠了。。。。 資料庫表弄好了,但是返回來寫又出問題了。。檢查了半點才發現是拼寫錯誤。。。。 混亂的思路一直沒有理清,所以建好的表結構發現也還是不能夠馬上用。。。。。。。。。。。。 似乎方法出問題了。 下面換個思路吧:每個練習學習的檔案明確一個目標,不把所有

python學習===白學編程(3)

都是 csv文件 size ffi business cal dict stock status 額不找接口,就是懈怠了。。。。 數據庫表弄好了,但是返回來寫又出問題了。。檢查了半點才發現是拼寫錯誤。。。。 混亂的思路一直沒有理清,所以建好的表結構發現也還是不能夠馬上用。。

python學習===白學程式設計(4)FOR語句學習

 最近拖延症嚴重發作學習有點斷斷續續,相應的隨筆也沒有更新,所以暫時不考慮完整性,先貼上來接續起來再說。   利用for語句就可以將不同的表名及欄位名賦值給相同的引數,複用同一個語句結構簡化程式碼。 需要的變數是介面名稱、輸入引數,輸出欄位、目標表名稱

Python學習(九)—【字串格式化】【百分號方式】【format方式】

寫在前面: 最近的事情好像有很多。李詠的離去,讓我覺得很突然,彷彿印象中就是主持節目的他,看著他和哈文的愛情,很是感動。離去,沒有什麼抱怨,只是遺憾。 總會感慨,時光的流逝。 好像真的很快,轉眼間,我都這麼大了。 最近,劉某人總說的一句話,小時候雖然很窮,但是很快樂 而現在,不僅僅是窮,而且還不快樂 想想還真

Python學習-變數字串函式

目錄 變數和型別 條件判斷 迴圈控制 函式 變數和型別 基本變數型別 整數 浮點數 字串 布林值 空值 函式 模組 型別* 自定義型別 變數定義  變數儲存在記憶體中的值。這就意味著在建立變數時會在記憶體中開闢一個空間。 基於變數的資料型別,

python學習(四)

[1] size class dex epc uri msu 語句 這就是 繼續昨天的學習,學到了數組。 首先有兩個數組,name1和name2.我們可以將兩個數組合並 name1=[1,2,3,4] name2=[5,6,7,8] names=name1.extend(

Python學習 002

else 內容 readline input rjust price info class 信息   今天寫著購物車的作業,最頭疼的是文件操作了 尤其是文件的打開模式  w  r  a  最TM的頭疼 r+模式可讀可寫,但是寫的內容會根據文件指針去覆蓋之前的內容,當文件

Python學習——基礎04篇

usr pre Coding color 偶數求和 存在 代碼 spa nbsp   在python中,有很強大的for循環和很強大的數組操作,一些在其他語言中復雜的代碼,在python中可以一行解決,下面是python中解決a,b數組所有偶數求和,存在c數組中的簡單代碼。

Python學習——基礎01篇

alt 自動 clj int jca 安裝完成 -s 但是 還需                                 安裝python編譯環境   python數字定義是不需要int,double的,但是數據本身還是包含這些類型,這裏是我在學習pytho

Python學習——基礎07篇

get pytho print cnblogs python學習 code class end bsp   在Python中,數組也是不需要定義的,但是我們可以事先申明,可以用append的方法來動態增加數組空間,也可以使用range來給數組大小添個集合,這一篇先用appe

Python學習——第二彈(認識python

內容 代碼結構 計算 戰術 個人 方法 十分 現在 目的   第一彈中我是說明了學習python的目的,主要為了自我提升的考慮,那麽為什麽我對python感興趣,python有什麽用了?本章就簡單說明下。   python的用途很廣,而且代碼十分簡潔,不像java、c等其他

python學習——第三彈 (作業篇第一題)

image 操作 啟動程序 代碼 color 鎖定文件 文件 文件內容 數據 作業一:編寫登錄接口1.輸入用戶名密碼2.認證成功後顯示歡迎信息3.輸錯三次後鎖定。 所需知識點 文件基本讀寫操作,循環,列表,字典 上面的作業題是在學習完數據類型和簡單的文件操作之後布置的,