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

首頁 > 編程 > Python > 正文

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

2020-02-23 04:20:33
字體:
來源:轉載
供稿:網友

前言

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

先看下面兩段代碼:

代碼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 中任何對象都有的三個通用屬性:唯一標識、類型、值。

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

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

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

不可變對象(immutable)

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

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

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


可變對象(mutable)

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

>>> 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            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 苍山县| 南雄市| 南汇区| 吉林市| 盐亭县| 井陉县| 维西| 泉州市| 织金县| 曲阳县| 巴林右旗| 原阳县| 华坪县| 冕宁县| 九寨沟县| 利辛县| 额尔古纳市| 金门县| 岢岚县| 同仁县| 界首市| 丰宁| 郁南县| 锡林郭勒盟| 民丰县| 达拉特旗| 宜丰县| 五河县| 安阳市| 衡南县| 平山县| 沁水县| 郸城县| 融水| 梓潼县| 革吉县| 洛宁县| 同心县| 城步| 镇沅| 塘沽区|