欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解python中的 is 操作符

 更新時間:2017年12月26日 13:57:12   作者:海納  
is 操作符是Python語言的一個內建的操作符。它的作用在于比較兩個變量是否指向了同一個對象。下面通過本文給大家詳細介紹python中的 is 操作符,需要的朋友參考下吧

大家可以與Java中的 == 操作符相互印證一下,加深一下對引用和對象的理解。原問題: Python為什么直接運行和在命令行運行同樣語句但結果卻不同,他們的緩存機制不同嗎?

其實,高票答案已經說得很詳細了。我只是再補充一點而已。

is 操作符是Python語言的一個內建的操作符。它的作用在于比較兩個變量是否指向了同一個對象。

與 == 的區(qū)別

class A():
 def __init__(self, v): 
  self.value = v
 def __eq__(self, t): 
  return self.value == t.value
a = A(3)
b = A(3)
print a == b
print a is b

這個結果是True,False。因為我們重寫了__eq__方法就使得a, b在比較的時候,只比較它們的value即可。只要它們的value相等,那么a, b就是相等的。

而 is 操作符是判斷兩個變量是否引用了同一個對象。

同一個對象?

is 的用法說起來其實挺簡單的,但是真正用起來,它的難點恰恰就在于判斷哪些對象是同一個對象。

看下面的幾個測試,先不看結果,自己能答對多少?

a = 10
b = 10
print a is b
a = 10.0
b = 10.0
print a is b
a = 10
def f():
 return 10
print f() is a
a = 1000
def f():
 return 1000
print f() is a
a = 10.0
def f():
 return 10.0
print f() is a

嗯。這個結果是True, True, True, False, False。你答對了嗎?

這個結果中牽扯到兩個問題:第一,就是小整數的緩存,第二,就是pyc文件中CodeObject的組織問題。

Python中把-127到128這些小整數都緩存了一份。這和Java的Integer類是一樣的。所以,對于-127到128之間的整數,整個Python虛擬機中就只有一個實例。不管你什么時候,什么場景下去使用 is 進行判斷,都會是True,所以我們知道了這兩個測試一定會是True:

a = 10
b = 10
print a is b
a = 10
def f():
 return 10
print f() is a

接著,我們重點看下,這兩個測試:

a = 10.0
b = 10.0
print a is b
a = 10.0
def f():
 return 10.0
print f() is a

為什么一個是True,一個是False。要探究這個問題,就要從字節(jié)碼的角度去分析了。我們先把這個文件編譯一下:

python -m compileall testis.py

然后再使用這個工具查看一下字節(jié)碼文件: 

  https:// github.com/hinus/railgu n/blob/master/src/main/python/rgparser/show.py

得到這樣的輸出:

 <argcount> 0 </argcount>
 <nlocals> 0</nlocals>
 <stacksize> 2</stacksize>
 <flags> 0040</flags>
 <code>
  6400005a00006400005a01006500006501006b080047486400005a000064
  01008400005a02006502008300006500006b0800474864020053
 </code>
 <dis>
 1   0 LOAD_CONST    0 (10.0)
    3 STORE_NAME    0 (a)

 2   6 LOAD_CONST    0 (10.0)
    9 STORE_NAME    1 (b)

 3   12 LOAD_NAME    0 (a)
    15 LOAD_NAME    1 (b)
    18 COMPARE_OP    8 (is)
    21 PRINT_ITEM   
    22 PRINT_NEWLINE  

 5   23 LOAD_CONST    0 (10.0)
    26 STORE_NAME    0 (a)

 6   29 LOAD_CONST    1 (<code object f>)
    32 MAKE_FUNCTION   0
    35 STORE_NAME    2 (f)

 8   38 LOAD_NAME    2 (f)
    41 CALL_FUNCTION   0
    44 LOAD_NAME    0 (a)
    47 COMPARE_OP    8 (is)
    50 PRINT_ITEM   
    51 PRINT_NEWLINE  
    52 LOAD_CONST    2 (None)
    55 RETURN_VALUE  
 </dis>
 <names> ('a', 'b', 'f')</names>
 <varnames> ()</varnames>
 <freevars> ()</freevars>
 <cellvars> ()</cellvars>
 <filename> 'testis.py'</filename>
 <name> '<module>'</name>
 <firstlineno> 1</firstlineno>
 <consts>
  10.0
  <code>
   <argcount> 0 </argcount>
   <nlocals> 0</nlocals>
   <stacksize> 1</stacksize>
   <flags> 0043</flags>
   <code> 64010053</code>
   <dis>
 7   0 LOAD_CONST    1 (10.0)
    3 RETURN_VALUE  
   </dis>
   <names> ()</names>
   <varnames> ()</varnames>
   <freevars> ()</freevars>
   <cellvars> ()</cellvars>
   <filename> 'testis.py'</filename>
   <name> 'f'</name>
   <firstlineno> 6</firstlineno>
   <consts>
   None
   10.0
   </consts>
   <lnotab> 0001</lnotab>
  </code>
  None
 </consts>
 <lnotab> 060106010b0206010902</lnotab>

大家注意看,整個python文件其實就是一個大的<code>對象,f 所對應的那個函數也是一個<code>對象,這個code對象做為整體是大的<code>對象的consts域里的一個const項。再注意,在大<code>對象里,有10.0這樣的一個const項,f 這個<code>對象所對應的conts里呢,也有一個10.0這個浮點數。

當python在加載這個文件的時候,就會完成主<code>里的10.0這個浮點數的加載,生成一個PyFloatObject。也就是說靜態(tài)的pyc文件的常量表在被加載以后,就變成了內存中的常量表,文件的表里的10.0就變成了內存中的一個PyFloatObject。所以,a, b兩個變量都會引用這個PyFloatObject。

但是 f 里的那個10.0呢?它是要等到MAKE_FUNCTION被調用的時候才會真正地初始化。做為 f 方法的返回值,它必然與我們之前所說的主<code>里的10.0不是同一個對象了。

本質上講,這是Python的一個設計缺陷(例如Java以一個文件為編譯單元,共享同一個常量池就會減輕這個問題。但如果跨文件使用 == 操作符,也會出現同樣的問題。仍然沒有解決這個問題。實際上,我自己也不知道該怎么解決這個問題。)我們應該盡量避免 is 的這種用法。始終把 is 的用法限制在本文的第一個例子中。這樣相對會安全一些。

相關文章

  • python與idea的集成的實現

    python與idea的集成的實現

    這篇文章主要介紹了 python與idea的集成的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • 使用OpenCV circle函數圖像上畫圓的示例代碼

    使用OpenCV circle函數圖像上畫圓的示例代碼

    這篇文章主要介紹了使用OpenCV circle函數圖像上畫圓的示例代碼,本文內容簡短,給大家突出重點內容,需要的朋友可以參考下
    2019-12-12
  • Python+pandas計算數據相關系數的實例

    Python+pandas計算數據相關系數的實例

    今天小編就為大家分享一篇Python+pandas計算數據相關系數的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Python利用contextvars實現管理上下文變量

    Python利用contextvars實現管理上下文變量

    Python?在?3.7?的時候引入了一個模塊:contextvars,從名字上很容易看出它指的是上下文變量。所以本文就來和大家詳細講講如何使用contextvars實現管理上下文變量,需要的可以參考一下
    2022-07-07
  • 詳解Python中的內置常量的使用

    詳解Python中的內置常量的使用

    Python作為一種功能強大的編程語言,提供了豐富的內置常量來簡化編程過程,本文將深入探討Python中的內置常量,并提供豐富的示例代碼來演示其用法,希望對大家有所幫助
    2024-03-03
  • pytorch?膨脹算法實現大眼效果

    pytorch?膨脹算法實現大眼效果

    在PS中,我們可以利用液化工具對人像進行瘦臉、放大眼睛等系列的常規(guī)操作。今天我們來了解一下這些操作的算法原理,并用pytorch?膨脹算法來實現大眼效果,感興趣的可以了解一下
    2021-11-11
  • 淺析Python 中整型對象存儲的位置

    淺析Python 中整型對象存儲的位置

    下面小編就為大家?guī)硪黄獪\析Python 中整型對象存儲的位置。小編覺得挺不錯的,現在分享給大家,也給大家做個參考,一起跟隨小編過來看看吧
    2016-05-05
  • 1 行 Python 代碼快速實現 FTP 服務器

    1 行 Python 代碼快速實現 FTP 服務器

    FTP 服務器,在此之前我都是使用Linux的vsftpd軟件包來搭建FTP服務器的,現在發(fā)現了利用pyftpdlib可以更加簡單的方法即可實現FTP服務器的功能。下面小編給大家?guī)砹? 行 Python 代碼快速實現 FTP 服務器,需要的朋友參考下
    2018-01-01
  • python3.9之你應該知道的新特性詳解

    python3.9之你應該知道的新特性詳解

    這篇文章主要介紹了python3.9之你應該知道的新特性詳解,需要的朋友可以參考下
    2021-04-04
  • Python數據分析matplotlib折線圖案例處理

    Python數據分析matplotlib折線圖案例處理

    這篇文章主要介紹了Python數據分析matplotlib折線圖案例處理,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08

最新評論