最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python解惑之整數(shù)比較詳解

 更新時間:2017年04月24日 10:10:58   作者:FOOFISH  
這篇文章主要給大家介紹了Python中整數(shù)比較的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),詳細(xì)會對大家學(xué)習(xí)python的整數(shù)具有一定的參考價值,需要的朋友下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。

前言

在 Python 中一切都是對象,毫無例外整數(shù)也是對象,對象之間比較是否相等可以用==,也可以用is。

==和is操作的區(qū)別是:

  • is比較的是兩個對象的id值是否相等,也就是比較倆對象是否為同一個實例對象,是否指向同一個內(nèi)存地址。
  • ==比較的是兩個對象的內(nèi)容是否相等,默認(rèn)會調(diào)用對象的__eq__()方法。

清楚is和==的區(qū)別之后,對此也許你有可能會遇到下面的這些困惑,于是就有了這樣一篇文章,試圖把Python中一些隱晦的東西趴出來,希望對你有一定的幫助。

我們先來看兩段代碼:

片段一:

>>> a = 256
>>> b = 256
>>> a == b
True
>>>

片段二:

>>> a = 256
>>> b = 256
>>> a is b
True
>>>

在交互式命令行執(zhí)行上面兩段代碼,代碼片段一中的a==b返回True很好理解,因為兩個對象的值都是256,對于片段二,a is b也返回True,這說明a和b是指向同一個對象的,可以檢查一下他們的id值是否相等:

>>> id(a)
8213296
>>> id(b)
8213296
>>> 

結(jié)果證明他倆的確是同一個對象,指向的是同一個內(nèi)存地址。那是不是所有的整數(shù)對象只要兩個對象的值(內(nèi)容)相等,它們就是同一個實例對象呢?換句話說,對于整數(shù)對象只要==返回True,is操作也會返回True嗎?

帶著這個問題來看下面這兩段代碼:

片段一:

>>> a = 257
>>> b = 257
>>> a == b
True
>>>

片段二:

>>> a = 257
>>> b = 257
>>> a is b
False
>>>

對于257,a is b返回的竟然是False,結(jié)果可能在你的意料之中,也有可能出乎你的意料,但不管怎么,我們還是要刨根問底,找出問題的真相。

解惑一

出于對性能的考慮,Python內(nèi)部做了很多的優(yōu)化工作,對于整數(shù)對象,Python把一些頻繁使用的整數(shù)對象緩存起來,保存到一個叫small_ints的鏈表中,在Python的整個生命周期內(nèi),任何需要引用這些整數(shù)對象的地方,都不再重新創(chuàng)建新的對象,而是直接引用緩存中的對象。Python把這些可能頻繁使用的整數(shù)對象規(guī)定在范圍[-5, 256]之間的小對象放在small_ints中,但凡是需要用些小整數(shù)時,就從這里面取,不再去臨時創(chuàng)建新的對象。因為257不再小整數(shù)范圍內(nèi),因此盡管a和b的值是一樣,但是他們在Python內(nèi)部卻是以兩個獨立的對象存在的,各自為政,互不干涉。

弄明白第一個問題后,我們繼續(xù)在Python交互式命令行中寫一個函數(shù),再來看下面這段代碼:

片段一:

>>> c = 257
>>> def foo():
...  a = 257
...  b = 257
...  print a is b
...  print a is c
... 
>>> foo()
True
False

呃,什么情況,是的,你沒看錯,片段一中的這段代碼 a、b 值都是257的情況下,出現(xiàn)了a is b返回True,而a is c 返回的False,a、b、c的值都為257,為什么會出現(xiàn)不同的結(jié)果呢?這對于剛剛好不容易建立起來的認(rèn)知就被徹底否決了嗎,那這段代碼中究竟發(fā)生了什么?難道解惑一中的結(jié)論是錯誤的嗎?

解惑二

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. structure-of-a-program

為了弄清楚這個問題,我們有必要先理解程序代碼塊的概念。Python程序由代碼塊構(gòu)成,代碼塊作為程序的一個最小基本單位來執(zhí)行。一個模塊文件、一個函數(shù)體、一個類、交互式命令中的單行代碼都叫做一個代碼塊。在上面這段代碼中,由兩個代碼塊構(gòu)成,c = 257作為一個代碼塊,函數(shù)foo作為另外一個代碼塊。Python內(nèi)部為了將性能進(jìn)一步的提高,凡是在一個代碼塊中創(chuàng)建的整數(shù)對象,如果存在一個值與其相同的對象于該代碼塊中了,那么就直接引用,否則創(chuàng)建一個新的對象出來。Python出于對性能的考慮,但凡是不可變對象,在同一個代碼塊中的對象,只有是值相同的對象,就不會重復(fù)創(chuàng)建,而是直接引用已經(jīng)存在的對象。因此,不僅是整數(shù)對象,還有字符串對象也遵循同樣的原則。所以 a is b就理所當(dāng)然的返回True了,而c和a不在同一個代碼塊中,因此在Python內(nèi)部創(chuàng)建了兩個值都是257的對象。為了驗證剛剛的結(jié)論,我們可以借用dis模塊從字節(jié)碼的角度來看看這段代碼。

>>> import dis
>>> dis.dis(foo)
 2   0 LOAD_CONST    1 (257)
    3 STORE_FAST    0 (a)

 3   6 LOAD_CONST    1 (257)
    9 STORE_FAST    1 (b)

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

 5   23 LOAD_FAST    0 (a)
    26 LOAD_GLOBAL    0 (c)
    29 COMPARE_OP    8 (is)
    32 PRINT_ITEM   
    33 PRINT_NEWLINE  
    34 LOAD_CONST    0 (None)
    37 RETURN_VALUE

可以看出兩個257都是從常量池的同一個位置co_consts[1]獲取的。

總結(jié)

一番長篇大論之后,得出兩點結(jié)論:

1、小整數(shù)對象[-5,256]是全局解釋器范圍內(nèi)被重復(fù)使用,永遠(yuǎn)不會被GC回收。

2、同一個代碼塊中的不可變對象,只要值是相等的就不會重復(fù)創(chuàng)建新的對象。似乎這些知識點對日常的工作一點忙也幫不上,因為你根本不會用is來比較兩個整數(shù)對象的值是否相等。那為什么還要拿出來討論呢?嗯,程序員學(xué)知識,不應(yīng)該淺嘗輒止,要充分發(fā)揮死磕到底的精神。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者使用python能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • 如何在Python中用三階指數(shù)平滑模型對金融數(shù)據(jù)集進(jìn)行擬合與預(yù)測

    如何在Python中用三階指數(shù)平滑模型對金融數(shù)據(jù)集進(jìn)行擬合與預(yù)測

    這篇文章主要介紹了如何在Python中用三階指數(shù)平滑模型對金融數(shù)據(jù)集進(jìn)行擬合與預(yù)測,本次實驗數(shù)據(jù)為10列金融數(shù)據(jù)集,且相互之間獨立,需要分別擬合預(yù)測,需要的朋友可以參考下
    2023-03-03
  • Python中urllib2模塊的8個使用細(xì)節(jié)分享

    Python中urllib2模塊的8個使用細(xì)節(jié)分享

    這篇文章主要介紹了Python中urllib2模塊的8個使用細(xì)節(jié)分享,本文講解了Proxy設(shè)置、Timeout設(shè)置、加入特定Header、Redirect、Cookie、PUT和DELETE方法等內(nèi)容,需要的朋友可以參考下
    2015-01-01
  • python安裝pywin32clipboard的操作方法

    python安裝pywin32clipboard的操作方法

    今天小編就為大家分享一篇python安裝pywin32clipboard的操作方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • matplotlib相關(guān)系統(tǒng)目錄獲取方式小結(jié)

    matplotlib相關(guān)系統(tǒng)目錄獲取方式小結(jié)

    這篇文章主要介紹了matplotlib相關(guān)系統(tǒng)目錄獲取方式小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • 使用python半分鐘輕松完成證件照換底色

    使用python半分鐘輕松完成證件照換底色

    是不是很多小伙伴兒都不清楚公司是需要藍(lán)底還是紅底的證件照,今天小編直接帶大家做一款Python換底色的一款小程序,不管什么底色兒,放馬過來
    2021-09-09
  • 樹莓派4B安裝Tensorflow的方法步驟

    樹莓派4B安裝Tensorflow的方法步驟

    這篇文章主要介紹了樹莓派4B安裝Tensorflow的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • django實現(xiàn)模板中的字符串文字和自動轉(zhuǎn)義

    django實現(xiàn)模板中的字符串文字和自動轉(zhuǎn)義

    這篇文章主要介紹了django實現(xiàn)模板中的字符串文字和自動轉(zhuǎn)義,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • python常用數(shù)據(jù)結(jié)構(gòu)集合詳解

    python常用數(shù)據(jù)結(jié)構(gòu)集合詳解

    這篇文章主要介紹了python常用數(shù)據(jù)結(jié)構(gòu)集合詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下,希望對你的學(xué)習(xí)有所幫助
    2022-08-08
  • Python iter()函數(shù)用法實例分析

    Python iter()函數(shù)用法實例分析

    這篇文章主要介紹了Python iter()函數(shù)用法,結(jié)合實例形式詳細(xì)分析了Python iter()函數(shù)的功能、使用方法及相關(guān)操作注意事項,需要的朋友可以參考下
    2018-03-03
  • Python通過yagmail實現(xiàn)發(fā)送郵件代碼解析

    Python通過yagmail實現(xiàn)發(fā)送郵件代碼解析

    這篇文章主要介紹了Python通過yagmail實現(xiàn)發(fā)送郵件代碼解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10

最新評論

板桥市| 漠河县| 永胜县| 余干县| 高碑店市| 镇康县| 辉南县| 乌拉特中旗| 海兴县| 土默特左旗| 吴江市| 唐山市| 安阳市| 香港 | 丹棱县| 龙陵县| 都匀市| 闸北区| 麻江县| 方山县| 扬州市| 健康| 牡丹江市| 万宁市| 武强县| 平度市| 广平县| 富阳市| 甘南县| 新郑市| 黑河市| 巴楚县| 凤山县| 凭祥市| 九台市| 星子县| 棋牌| 南溪县| 迁安市| 滕州市| 姚安县|