1. 程式人生 > >解密python的id()函式

解密python的id()函式

>>> a = 2.5

>>> b = 2.5
>>> c = b
>>> a is c
False
>>> a = 2
>>> b = 2
>>> c = b
>>> a is c
True

今天在使用is函式的時候去列印a,b分別被賦值為2.5 和2的情況,發現:

>>> a = 2
>>> b = 2
>>> id(a)
21132060
>>> id(b)
21132060
>>> a = 2.5
>>> b = 2.5
>>> id(a)
19622112
>>> id(b)
29321464


當a,b為2的時候id相同,而為2.5的時候不同,這種情況在string字串的時候也會出現,即當很短的a,b賦值很短的字串的時候,它們的id值相同,而很長的則不會;

在查閱了:

http://stackoverflow.com/questions/4293408/ids-of-immutable-types

http://stackoverflow.com/questions/3402679/identifying-objects-why-does-the-returned-value-from-id-change

之後,可以得到一個簡單的結論就是:直譯器在對值很小的int和很短的字串的時候做了一點小優化,只分配了一個物件,讓它們id一樣了。

相關推薦

解密python的id函式

>>> a = 2.5 >>> b = 2.5 >>> c = b >>> a is c False >>> a = 2 >>> b = 2 >>>

pandas stack函式可用於轉置,但功能絕不僅僅限於轉置。真正的轉置是df.T

實際上轉置是df.T http://pandas.pydata.org/pandas-docs/stable/reshaping.html#reshaping-and-pivot-tables  Reshaping and Pivot Tables R

模式對話方塊和非模式對話方塊、accept函式、exec函式,Accepted訊號區別

一.非模式對話方塊   非模式對話方塊是和同一個程式中其它視窗操作無關的對話方塊。在字處理軟體中查詢和替換對話方塊通常是非模式的來允許同時與應用程式主視窗和對話方塊進行互動。呼叫show()來顯示非模式對話方塊。show()立即返回,這樣呼叫程式碼中的控制流將會繼續。   非模式

Python:range函式

range() 函式 range(stop) 用來生成0~stop區間內的整數,直到stop為 止(不包含stop) range(start, stop[,step]) 用來生成start~stop區 間內的整數,直到stop為止(不包含s

np.nonzero函式用法

返回陣列中不為0的元素的下標。 陣列中元素可為布林、整型和浮點型,返回值為元祖 一.一維陣列 1.陣列元素為布林型別 a=np.array([True,False,True,False]) b=np.nonzero(a) print(b) 輸出結果為(array([0, 2], dtype

python中的encode和decode函式

前言: 我們知道,計算機是以二進位制為單位的,也就是說計算機只識別0和1,也就是我們平時在電腦上看到的文字,只有先變成0和1,計算機才會識別它的意思。這種資料和二進位制的轉換規則就是編碼。計算機的發展中,有ASCII碼,GBK,Unicode,utf-8編碼。我們先從編碼的發展史瞭解一下編碼的進化過程。

python中的open函式

定義: python open() 函式用於開啟一個檔案,建立一個 file 物件,相關的方法才可以呼叫它進行讀寫 引數: 模式 描述 r 以只讀方式開啟檔案。檔案的指標將會放在檔案的開頭。這是預設模式。 rb 以

numpy的cumsum 函式

cumsum是matlab中一個函式,通常用於計算一個陣列各行的累加值,函式用法是B = cumsum(A,dim),或B = cumsum(A)。   函式功能 呼叫格式及說明 格式一:B = cumsum(A) 這種用法返回陣列不同維數的累加和。

eval函式的理解

  import tensorflow as tf import numpy as np with tf.variable_scope("test1",initializer=tf.constant_initializer(0.4)): var1=tf.get_variabl

詳解JavaScript中的replace函式

  Javascript中字串物件有一個方法replace(),它的作用非常強大。這裡把它的用法整理一下。   一、方法簡介   該方法的簽名是:replace([RegExp|String],[String|Function])。   該方法 返回一個新的字串,但並不改變字串本身。

ucosII移植學習過程,OS_CPU_SR_Save()和OS_CPU_SR_Restore函式的解析

今天突然興起回顧了一下ucosII,本人在這方面也是小白,但研究了一下,也算有點收穫,在此記錄一下。 我們都知道,程式碼的臨界段,也叫臨界區,指的是處理時不可以分割的程式碼。一旦這部分程式碼開始執行,則不容許任何中斷打斷。為了確保臨界段程式碼的可靠執行,在進入臨界段之前一定要關閉中斷,而臨界段執

sprintf函式的用法

sprintf函式的格式:int sprintf( char *buffer, const char *format [, argument,...] ); 除了前兩個引數固定外,可選引數可以是任意個。buffer是字元陣列名;format是格式化字串 常用方式 sprintf函式的功能與print

python中的分支和迴圈:for 迴圈,while迴圈,三元操作符,斷言,assert關鍵字,rang函式總結

1.python中的條件語句 例:score=int(input('請輸入一個分數'))        if 100>=score>=90:              

C語言學習筆記:printf函式詳解

C語言中有關printf()函式的詳細使用方法: 修飾符: - digit(s) :欄位寬度的最小值。如果該欄位不能容納要列印的數或者字串,系統就會使更寬的欄位。 如%4d。 - .digit(s):精度,將結果保留到小數點後的多少位。 - h: 和整數轉

CAST函式用法

Cast(欄位名 as 轉換的型別 ),其中型別可以為:CHAR[(N)] 字元型 DATE  日期型DATETIME  日期和時間型DECIMAL  float型SIGNED  intTIME  時間型例如表table1date2015-11-03 15:31:26sele

Python中的bytearray和bytes函式

Python中的bytearray()和bytes()函式 概述 bytearray() 函式返回新位元組陣列,數組裡的元素可變,且每個元素的值在0至255之間。bytes()函式是Python 3中增加的內建函式,語法、引數與bytearray() 一樣,只是返回的新位元組陣列不可

列印字元26個字母的大小寫字元ord函式和chr() 函式的應用

for i in range(ord('A'), ord('Z')+1): print(chr(i)) for i in range(ord('a'),ord('z')+1): print(chr(i)) 這裡有兩個函式ord()     chr()   

js中eval函式的使用

1.eval() 函式作用:可以接受一個字串str作為引數,並把這個引數作為指令碼程式碼來 執行。 2.引數情況:(1)如果引數是一個表示式,eval() 函式將執行表示式;          

為什麼使用getaddrinfo函式

在IPv6的應用中getaddrinfo()是很常見的,最常見的形式是: addrinfo hints; addrinfo *res = NULL; memset(&hints,0,sizeof(hints)); hints.ai_family=AF_INE

advance函式

目錄 一、 迭代器                                                              --------參考文獻