国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

詳解python中的 is 操作符

2020-02-16 11:18:59
字體:
來源:轉載
供稿:網友

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

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

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

與 == 的區別

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

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

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

同一個對象?

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

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

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

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

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

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

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

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

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

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

python -m compileall testis.py

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

  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>            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 上饶市| 华安县| 连云港市| 古田县| 泗洪县| 申扎县| 枣庄市| 察雅县| 涟源市| 惠水县| 左贡县| 定陶县| 宜阳县| 阳西县| 团风县| 永修县| 丁青县| 湛江市| 青冈县| 阿巴嘎旗| 澄城县| 东乡县| 炉霍县| 肇州县| 大埔县| 澎湖县| 乌兰察布市| 苍南县| 高要市| 永康市| 囊谦县| 息烽县| 平邑县| 吴江市| 罗江县| 固阳县| 莱芜市| 克什克腾旗| 蕲春县| 锦州市| 绥棱县|