1. 程式人生 > >python--為什麼Python有相同的不可變物件id不同?

python--為什麼Python有相同的不可變物件id不同?

測試環境Python 2.7.3 & python 3.6

小一點int型別相等
s = 1
r = 1 # id(s) == id(r) true
大一點的int型別就不一樣了?
s = 1111111111
r = 11111111111 # id(s) != id(r)
所有測試的float型別都不相等
s = 1.1
r = 1.1
id(s) != id(r)
所有測試的tuple型別都不相等
s = (1, 2)
r = (1, 2)
id(s) != id(r)
所有測試的str都相等
s = ‘aaaa’
r = ‘aaaa’
id(s) == id(r)
不是應該都複用相同的不可變物件用以節約記憶體嗎?

回答:

#ifndef NSMALLPOSINTS
#define NSMALLPOSINTS           257
#endif
#ifndef NSMALLNEGINTS
#define NSMALLNEGINTS           5
#endif
#if NSMALLNEGINTS + NSMALLPOSINTS > 0
/* References to small integers are saved in this array so that they
   can be shared.
   The integers that are saved are those in the range
   -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive).
*/
static PyIntObject *small_ints[NSMALLNEGINTS + NSMALLPOSINTS]; #endif
  int清楚寫了[-5, 256] 這些小整數被定義在了這個物件池裡.所以當引用小整數時會自動引用整數物件池裡的物件的.
  string物件也是不可變物件,python有個intern機制,簡單說就是維護一個字典,這個字典維護已經建立字串(key)和它的字串物件的地址(value),每次建立字串物件都會和這個字典比較,沒有就建立,重複了就用指標進行引用就可以了.

 string實現了intern共享?我覺得是一種空間效率和時間效率的妥協。相比於數字,string本身參與的運算要少很多,而且string本身佔據的空間也大許多,因此string的主要問題在於不共享帶來的空間浪費,所以string實現了很費時間的intern操作。對於數字情況正好相反。作為一個數字,需要做的運算要比string多太多了,而且大小比string也小很多。如果在計算10000+20000之前先花好久查詢重複物件,導致一個1ms完成的加法花了100ms,我肯定想砸電腦的。

  float型別可以認為每個賦值都是建立一個物件,因為float有點多,所以沒必要和int一樣了.

  tuple它是不可變物件,理應和int和string一樣會做一個快取,但是書上沒有說明,於是看了看原始碼,發現tuple的資料結構很簡單,簡單到不能再簡單,就是一個數組,裡面是元組的迭代物件,這個物件指向的是各個元素.最關鍵的是元組沒有實現intern機制!所以元組雖然是不可變物件,但它同時也是一個數組,這個陣列和c裡的陣列一樣,每次建立都會分配記憶體空間。

相關推薦

python--為什麼Python相同可變物件id不同

測試環境Python 2.7.3 & python 3.6 小一點int型別相等 s = 1 r = 1 # id(s) == id(r) true 大一點的int型別就不一樣了? s = 1111111111 r = 11111

python筆記-可變物件可變物件

        python中,萬物皆物件。所有的物件可以分為可變物件與不可變物件兩類。當變數引用不可變物件時,使用該變數的任何操作,都會建立新物件,而不會改變引用的物件。與此相反,變數引用可變物件時,或者可能建立新的物件,或者改變被引用的物件本身,這取決於進

python 傳值 傳引用 可變物件 可變物件 的區別與聯絡

可變物件 與 不可變物件 我們知道在python中一切皆物件。在python世界中可以把物件大體分成兩大類: 不可變物件:數字(int,float, double)、字串、元組(tuple)、function等 可變物件:字典(dict)、列表(list)、集合(set)、程式自定

python,可變物件可變物件,深拷貝,淺拷貝。

學習整理,若有問題,歡迎指正。 python 可變物件,不可變物件 可變物件 該物件所指定的記憶體地址上面的值可以被改變,變數被改變後,其所指向的記憶體地址上面的值,直接被改變,沒有發生複製行為,也沒有發生開闢新的記憶體地址行為。 python可變物件有,列表,字典,set集合 列如:

Python中的可變物件可變物件Python對於可變物件列表和可變物件列表做列表乘法

Python中的不可變物件和可變物件: 不可變物件指該物件所指向的記憶體中的值不能被改變。當改變某個變數時候,由於其所指的值不能被改變,相當於把原來的值複製一份後再改變,這會開闢一個新的地址,變數再指向這個新的地址。 可變物件指該物件所指向的記憶體中的值可以被改變。變數(準確的說是引用)

Python可變物件可變物件

什麼是可變/不可變物件 不可變物件,該物件所指向的記憶體中的值不能被改變。當改變某個變數時候,由於其所指的值不能被改變,相當於把原來的值複製一份後再改變,這會開闢一個新的地址,變數再指向這個新的地址。 可變物件,該物件所指向的記憶體中的值可以被改變。變數(準確的說是引

【探究】Python可變型別和可變型別ID的變化

# 不可變型別 print("#"*50) print("不可變型別:") print("元組測試:") tuple_01 = (123, 456) print("tuple_01的資料為:【%s】

python知識整理--議可變物件可變物件以及str、list、tuple、dict、set

可變物件:變數、list 不可變物件:str、tuple、dict、set 1、變數是可變的不用多說,變數賦值一次便改變一次。 2、list 可變物件,可對list進行如下新增刪除排序等操作。 list = [2,3,5,1,2] list.append(8) list.insert(0,

Python中的可變物件可變物件

什麼是可變/不可變物件 不可變物件,該物件所指向的記憶體中的值不能被改變。當改變某個變數時候,由於其所指的值不能被改變,相當於把原來的值複製一份後再改變,這會開闢一個新的地址,變數再指向這個新的地址。 可變物件,該物件所指向的記憶體中的值可以被改變。變數(準確的說是引用)改變後,實際上是其所指的值直接發生

Python經驗主義學習之路——可變物件可變物件

可變物件與不可變物件 資料型別和變數 Python的資料型別和C++幾乎相同,但是變數的概念和C++/C目前來看有一點差別(但在彙編的角度上看,和彙編中的變數概念差不多),在C/C++中,我們可以把變數在邏輯上抽象成一個帶有名字的盒子,如下簡單程式碼。

Python中的可變可變物件;值型別,引用型別;淺拷貝,深拷貝理解

乍一看,好像有一些相通之處。 1. 可變物件和不可變物件 python中一切物件,型別也是物件 python中不可變型別有int,sring,tuple 可變型別有list和dict 看下面程式碼: # 不可變物件 >>> a

Python 可變物件練習

Python 不可變物件練習 str 是不可變物件,就是對這個物件進行操作不會改變這個物件的資料。 如下: >>> a = 'abc' >>> a.replace('a', 'A') 'Abc' # 看起是改了,但並不是,只是建立了一個新的 str 物件 >

python 列表、元組、字典、集合 、可變物件的學習

列表list 是可變的 用[]  len() 可以獲得list的元素個數cmp(list1, list2)比較兩個列表的元素len(list)列表元素個數max(list)返回列表元素最大值min(list)返回列表元素最小值list(seq)將元組轉換為列表list.app

關於Python中的可變物件可變物件的區別

Python中的可變物件與不可變物件什麼是可變物件/不可變物件:可變物件:物件存放在地址中的值不會被改變(所謂的改變是建立了一塊新的地址並把新的物件的值放在新地址中原來的物件並沒有發生變化)不可變物件:物件存放在地址中的值會原地改變int str float tuple 都屬

可變物件 vs 可變物件Python

Python 在 heap 中分配的物件分成兩類:可變物件和不可變物件。所謂可變物件是指,物件的內容是可變的,例如 list。而不可變的物件則相反,表示其內容不可變。 不可變物件:int,string,float,tuple 可變物件 :list,dic

Python學習筆記——可變物件可變物件

知識點:python中,萬物皆物件。    python中不存在所謂的傳值呼叫,一切傳遞的都是物件的引用,也可以認為是傳址。 一、可變物件和不可變物件 Python在heap中分配的物件分成兩類:可變物件和不可變物件。所謂可變物件是指,物件的內容可變,而不可變物件是指

python可變可變物件

python的物件分為可變物件(mutable)和不可變物件(immutable) 不可變物件(immutable)包括:常數、字串、元組和不可變集合(frozensets) 可變物件包括:列表、字典

python學習(五)之dict+set+可變物件

dict Python內建了字典:dict的支援,dict全稱dictionary,在其他語言中也稱為map,使用鍵-值(key-value)儲存,具有極快的查詢速度。 舉個例子,假設要根據同學的名字查詢對應的成績,如果用list實現,需要兩個list

Python學習日記】dic和set 以及什麼是 可變物件

轉載自 http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143167793538255 dict Python內建了字典:dict的支援,dict全稱

python中list ,tuple,dict,set的關係以及可變物件解釋(圖文詳解)

list 1.list可以放進tuple (易知) 2.list可以放入dict作為value,但不可以作為key >>> key = [1, 2, 3] >>> d[key] = 'a list' Traceback (most