小數據池 is 和 ==的區別

小數據池

1、小數據池

1)代碼塊

    python程序是由代碼塊構成的,一個代碼塊的文本做爲pythont程序執行的單元python

官方文檔:
     A Python program is constructed from code blocks. A block is a piece of Python program text that is executed as a unit. The following are blocks: 
a module, a function body, and a class definition. Each command typed interactively is a block. A script file (a file given as standard input to the
interpreter or specified as a command line argument to the interpreter) is a code block. A script command (a command specified on the interpreter command
line with the ‘-c‘ option) is a code block. The string argument passed to the built-in functions eval() and exec() is a code block. A code block is executed
in an execution frame. A frame contains some administrative information (used for debugging) and determines where and how execution continues after the code
block’s execution has completed.

一個代碼塊:編程

  • 一個模塊(module)
  • 一個函數(function)
  • 一個類(class)
  • 每個command命令
  • 一個文件(file)
  • eval()
  • exec()

2)id()

    經過id()能夠查看到一個變量表示的值在內存中的地址緩存

s = "hello"
print(id(s)) # 2305859175064

 3) is 和 == 區別

  • ==:判斷左右兩端的值是否相等
  • is:判斷左右兩端內容的內存地址是否一致。若是返回True,那能夠肯定這兩個變量使用的是同一個對象

    若是內存地址相同,則值必定是相等的,若是值相等,則不必定同一對象編程語言

a = 100
b = 100
print(a is b)  # True
print(a == b)  # True

 

a = 1000
b = 1000

print(a == b) # True
print(a is b) # False 在command命令下爲False, 在.py文件中(例如pycharm中)獲得的結果爲True。(詳情見下面)

 4) 小數據池

  • 一種緩存機制,也被稱爲駐留機制。各大編程語言中都有相似的東西。網上搜索常量池,小數據池指的是同一個內容
  • 小數據池只針對:int(整數), string(字符串), bool(布爾值)。其餘數據類型不存在駐留機制

優勢:可以提升字符串、整數的處理速度。省略了建立對象的過程。函數

缺點:在"池"中建立或者插入新的內容會花費更多的時間。ui

1.整數this

官方文檔:
    The current implementation keeps an array of integer objects for all integers between -5 and 256, when you create an int in that range you 
actually just get back a reference to the existing object. So it should be possible to change the value of 1. I suspect the behavior of Python in
this case is undefined.

 

  • 在python中,-5~256會被加到小數據池中,每次使用都是同一個對象
  • 在使用的時候,內存中只會建立一個該數據的對象,保存在小數據池中。當使用的時候直接從小數據池中獲取對象的內存引用,而不須要從新建立一個新的數據,這樣會節省更多的內存區域。

2.字符串spa

Incomputer science, string interning is a method of storing only onecopy of each distinct string value, which must be immutable. Interning strings makes 
some stringprocessing tasks more time- or space-efficient at the cost of requiring moretime when the string is created or interned. The distinct values are
stored ina string intern pool. –引⾃自維基百科
  • 若是字符串的長度是0或者1,都會默認進行緩存。(中文字符無效)
  • 字符串長度大於1,可是字符串中只包含數字,字母,下劃線時會被緩存。
  • 用乘法獲得的字符串:1)乘數爲1,僅包含數字,字母,下劃線時會被緩存。若是包含其餘字符,而長度<= 1也會被駐存(中文字符除外)。2)乘數大於1,僅包含數字,字母,下劃線時會被緩存,但字符串長度不能大於20
  • 指定駐留:能夠經過sys模塊中的intern()函數來指定要駐留的內容。(詳情見sys模塊相關內容)

5)代碼塊緩存機制

    在代碼塊內緩存機制是不同的:debug

  • 在執行同一個代碼塊的初始化對象的命令時,會檢查其值是否已經存在,若是存在,會將其重用。換句話說:執行同一個代碼塊時,遇到初始化對象的命令時,他會將初始化的這個變量與值存儲在一個字典中,再遇到新的初始化對象命令時,先在字典中查詢其值是否已經存在,若是存在,那麼它會重複使用這個字典中的以前的這個值。即兩變量指向同一個內存地址。
  • 若是是不一樣的代碼塊,則判斷這兩個變量是否知足小數據池的數據,若是知足,則兩變量指向同一個地址。若是不知足,則獲得兩個不一樣的對象,即兩變量指向的是不一樣的內存地址。

注意:對於同一個代碼塊,只針對單純建立變量,纔會採用緩存機制,對於建立變量並同時作相關運算,則無。code

a = 1000
b = 1000

print(id(a)) # 2135225709680
print(id(b)) # 2135225709680
print(a is b)  # True  .py文件運行
a = 1000
b = 10*100

print(id(a)) # 1925536396400
print(id(b)) # 1925536643952
print(a is b) # False  .py文件運行

 6)小數據池與代碼塊緩存機制區別與聯繫

  • 小數據池與代碼塊對緩存數據類型要求不一致,代碼塊只針對單純建立變量有效,而對整數大小,字符串字符要求及長度無限制。
  • 對於代碼塊緩存機制:若是不知足代碼塊緩存機制,則判斷是否知足小數據池數據,若是知足,則採用小數據池緩存機制。
a = 5*5
b = 25

print(id(a))  # 1592487712
print(id(b))  # 1592487712

print(a is b)  # True  .py文件運行
a = "Incomputer science, string interning is a method of storing only onecopy of each distinct string value"
b = "Incomputer science, string interning is a method of storing only onecopy of each distinct string value"

print(id(a)) # 2926961023256
print(id(b)) # 2926961023256

print(a is b) # True  .py文件運行
相關文章
相關標籤/搜索