亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解Python中表達式i += x與i = i + x是否等價

 更新時間:2017年02月08日 11:57:02   作者:一個程序員的微站  
這篇文章主要介紹了關(guān)于Python中表達式i += x與i = i + x是否等價的相關(guān)資料,文中通過示例代碼介紹的很詳細,相信對大家具有一定的參考價值,有需要的朋友們下面來一起看看吧。

前言

最近看到一個題目,看似很簡單,其實里面有很深的意義,題目是Python 表達式 i += x 與 i = i + x 等價嗎?如果你的回答是yes,那么恭喜你正確了50%,為什么說只對了一半呢? 按照我們的一般理解它們倆是等價的,整數(shù)操作時兩者沒什么異同,但是對于列表操作,是不是也一樣呢?

先看下面兩段代碼:

代碼1

>>> l1 = range(3)
>>> l2 = l1
>>> l2 += [3]
>>> l1
[0, 1, 2, 3]
>>> l2
[0, 1, 2, 3]

代碼2

>>> l1 = range(3)
>>> l2 = l1
>>> l2 = l2 + [3]
>>> l1
[0, 1, 2]
>>> l2
[0, 1, 2, 3]

代碼1與代碼2中的l2的值是一樣的,但是l1的值卻不一樣,說明 i += x 與 i = i + x 是不等價的,那什么情況下等價,什么情況下不等價呢?

弄清楚這個問題之前,首選得明白兩個概念:可變對象與不可變對象。

在 Python 中任何對象都有的三個通用屬性:唯一標識、類型、值。

唯一標識:用于標識對象的在內(nèi)存中唯一性,它在對象創(chuàng)建之后就不會再改變,函數(shù) id()可以查看對象的唯一標識

類型:決定了該對象支持哪些操作,不同類型的對象支持的操作就不一樣,比如列表可以有l(wèi)ength屬性,而整數(shù)沒有。同樣地對象的類型一旦確定了就不會再變,函數(shù) type()可以返回對象的類型信息。

對象的值與唯一標識不一樣,并不是所有的對象的值都是一成不變的,有些對象的值可以通過某些操作發(fā)生改變,值可以變化的對象稱之為可變對象(mutable),值不能改變的對象稱之為不可變對象(immutable)

不可變對象(immutable)

對于不可變對象,值永遠是剛開始創(chuàng)建時候的值,對該對象做的任何操作都會導(dǎo)致一個新的對象的創(chuàng)建。

>>> a = 1
>>> id(a)
32574568
>>> a += 1
>>> id(a)
32574544

整數(shù) “1” 是一個不可變對象,最初賦值的時候,a 指向的是整數(shù)對象 1 ,但對變量a執(zhí)行 += 操作后, a 指向另外一個整數(shù)對象 2 ,但對象 1 還是在那里沒有發(fā)生任何變化,而 變量 a 已經(jīng)指向了一個新的對象2。常見的不可變對象有:int、tuple、set、str。


可變對象(mutable)

可變對象的值可以通過某些操作動態(tài)的改變,比如列表對象,可以通過append方法不斷地往列表中添加元素,該列表的值就在不斷的處于變化中,一個可變對象賦值給兩個變量時,他們共享同一個實例對象,指向相同的內(nèi)存地址,對其中任何一個變量操作時,同時也會影響另外一個變量。

>>> x = range(3)
>>> y = x

>>> id(x)
139726103041232
>>> id(y)
139726103041232

>>> x.append(3)
>>> x
[0, 1, 2, 3]
>>> y
[0, 1, 2, 3]

>>> id(x)
139726103041232
>>> id(y)
139726103041232

執(zhí)行append操作后,對象的內(nèi)存地址不會改變,x、y 依然指向的是原來同一個對象,只不過是他的值發(fā)生了變化而已。


理解完可變對象與不可變對象后,回到問題本身,+= 與 +的區(qū)別在哪里呢?

+= 操作首先會嘗試調(diào)用對象的 __iadd__方法,如果沒有該方法,那么嘗試調(diào)用__add__方法,先來看看這兩個方法有什么區(qū)別

__add__和 __iadd__ 的區(qū)別

  1. __add__ 方法接收兩個參數(shù),返回它們的和,兩個參數(shù)的值均不會改變。
  2. __iadd__ 方法同樣接收兩個參數(shù),但它是屬于 in-place 操作,就是說它會改變第一個參數(shù)的值,因為這需要對象是可變的,所以對于不可變對象沒有__iadd__方法。
>>> hasattr(int, '__iadd__')
False
>>> hasattr(list, '__iadd__')
True

顯然,整數(shù)對象是沒有__iadd__的,而列表對象提供了__iadd__方法。

>>> l2 += [3] # 代碼1:使用__iadd__,l2的值原地修改

代碼1中的 += 操作調(diào)用的是__iadd__方法,他會原地修改l2指向的那個對象本身的值

>>> l2 = l2 + [3] # 代碼2:調(diào)用 __add__,創(chuàng)建了一個新的列表,賦值給了l2

而代碼2中的 + 操作調(diào)用的是 __add__ 方法,該方法會返回一個新的對象,原來的對象保持不變,l1還是指向原來的對象,而l2已經(jīng)指向一個新的對象。

以上就是表達式 i += x 與 i = i + x 的區(qū)別。因此對于列表進行 += 操作時,會存在潛在的bug,因為l1會因為l2的變化而發(fā)生改變,就像函數(shù)的參數(shù)不宜使用可變對象作為關(guān)鍵字參數(shù)一樣。

總結(jié)

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

相關(guān)文章

  • python如何從文件讀取數(shù)據(jù)及解析

    python如何從文件讀取數(shù)據(jù)及解析

    這篇文章主要介紹了python如何從文件讀取數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • Python max函數(shù)中key的用法及原理解析

    Python max函數(shù)中key的用法及原理解析

    最近有童鞋向小編求助怎么樣找到字符串中出現(xiàn)字數(shù)最多的字符呢,其實最簡單的處理方法是使用max函數(shù),max()函數(shù)用于獲得給定的可迭代對象中的最大值,關(guān)于Python max函數(shù)key用法跟隨小編一起通過本文學(xué)習(xí)下吧
    2021-06-06
  • 基于Python實現(xiàn)批量縮放圖片(視頻)尺寸

    基于Python實現(xiàn)批量縮放圖片(視頻)尺寸

    這篇文章主要為大家詳細介紹了如何通過Python語言實現(xiàn)批量縮放圖片(視頻)尺寸的功能,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-03-03
  • Python圖形驗證碼識別教程詳解

    Python圖形驗證碼識別教程詳解

    這篇文章主要介紹了Python圖形驗證碼識別,目前,許多網(wǎng)站采取各種各樣的措施來反爬蟲,其中一個措施便是使用驗證碼。隨著技術(shù)的發(fā)展,驗證碼的花樣越來越多。驗證碼最初是幾個數(shù)字組合的簡單的圖形驗證碼,后來加入了英文字母和混淆曲線
    2023-02-02
  • Python中使用matplotlib庫繪制各種圖

    Python中使用matplotlib庫繪制各種圖

    這篇文章主要介紹了Python中使用matplotlib庫繪制各種圖方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Python?__all__變量用法示例詳解

    Python?__all__變量用法示例詳解

    這篇文章主要介紹了Python?__all__變量用法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • Django使用unittest模塊進行單元測試過程解析

    Django使用unittest模塊進行單元測試過程解析

    這篇文章主要介紹了Django使用unittest模塊進行單元測試過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • 使用python爬取4K壁紙保存到本地文件夾的全過程

    使用python爬取4K壁紙保存到本地文件夾的全過程

    圖片信息豐富多彩,許多網(wǎng)站上都有大量精美的圖片資源,有時候我們可能需要批量下載這些圖片,而手動一個個下載顯然效率太低,所以本文給大家介紹了使用python爬取4K壁紙保存到本地文件夾的全過程,文中有詳細的代碼示例供大家參考,需要的朋友可以參考下
    2024-03-03
  • python編程使用協(xié)程并發(fā)的優(yōu)缺點

    python編程使用協(xié)程并發(fā)的優(yōu)缺點

    協(xié)程是一種用戶態(tài)的輕量級線程,又稱微線程。這篇文章主要介紹了python編程使用協(xié)程并發(fā)的優(yōu)缺點,感興趣的朋友跟隨小編一起看看吧
    2018-09-09
  • 使用Python快速搭建文件傳輸服務(wù)的方法

    使用Python快速搭建文件傳輸服務(wù)的方法

    這篇文章主要介紹了使用Python快速搭建一個文件傳輸服務(wù),這樣任何一個人都能打開瀏覽器把他電腦上的文件傳給我了,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2023-07-07

最新評論