Python当中的a += a 与 a = a + a 的区别,可变类型与不可变类型的数据类型,引用传参...
a += a 與 a = a + a 的區(qū)別
可變類(lèi)型a = a + a 的示例
?
In [58]: a = [11,22]In [59]: id(a) Out[59]: 140702917607688In [60]: a = a + aIn [61]: a Out[61]: [11, 22, 11, 22]In [62]: id(a) Out[62]: 140703006930440In [63]: # 注意id的結(jié)果不同分析以上的代碼:
第一步:計(jì)算賦值運(yùn)算符右邊的代碼 [11,22]+[11,22] = [11,22,11,22]
第二步:將計(jì)算的新結(jié)果開(kāi)辟了新的內(nèi)存保存
第三步:讓a指向了新的內(nèi)存
可變類(lèi)型的a += a示例
In [63]: a = [11,22]In [64]: id(a) Out[64]: 140702994655880In [65]: a += aIn [66]: id(a) Out[66]: 140702994655880In [67]: a Out[67]: [11, 22, 11, 22] #注意id的值沒(méi)變
分析以上的代碼:
a += a ?是在原來(lái)a的指向的內(nèi)存里修改值 a的指向并沒(méi)有修改
注意以上是可變類(lèi)型 ?下面看一下不可變類(lèi)型
In [68]: a = 1In [69]: id(a) Out[69]: 10914368In [70]: a += aIn [71]: id(a) Out[71]: 10914400In [72]: a Out[72]: 2==================================================== In [76]: a = 1In [77]: id(a) Out[77]: 10914368In [78]: a = a + aIn [79]: id(a) Out[79]: 10914400In [80]: a Out[80]: 2
總結(jié):
如果a是一個(gè)可變類(lèi)型,那么a += a 是在a指向的內(nèi)存中直接修改,a = a+a 是指向了一個(gè)新的內(nèi)存
?如果a是一個(gè)不可變類(lèi)型,那么a += a 和a = a+a 的效果一樣即:a指向了一個(gè)新的內(nèi)存
?
?
?
可變類(lèi)型與不可變類(lèi)型的數(shù)據(jù)類(lèi)型
?
可變類(lèi)型,值可以改變:
? 列表 list
? 字典 dict
不可變類(lèi)型,值不可以改變:
? 數(shù)值類(lèi)型 int, long, bool, float
? 字符串 str
? 元組 tuple
?
不可變類(lèi)型示例:
In [81]: a = 1In [82]: id(a) Out[82]: 10914368In [83]: a += 1In [84]: a Out[84]: 2In [85]: id(a) Out[85]: 10914400總結(jié):
python中的不可變數(shù)據(jù)類(lèi)型,不允許變量的值發(fā)生變化,如果改變了變量的值,相當(dāng)于是新建了一個(gè)對(duì)象;
可變類(lèi)型示例:
In [89]: a = [11,22]In [90]: b = [11,22]In [91]: id(a) Out[91]: 140702995536840In [92]: id(b) Out[92]: 140702918106696In [93]: a.append(33)In [94]: id(a) Out[94]: 140702995536840In [95]: a Out[95]: [11, 22, 33]In [96]: # 注意a的值變了地址沒(méi)有發(fā)生變化?
總結(jié):
可變數(shù)據(jù)類(lèi)型,允許變量的值發(fā)生變化,即如果對(duì)變量進(jìn)行append、+=(注意除了 a = a+a這種形式)等這種操作后,只是改變了變量的值,而不會(huì)新建一個(gè)對(duì)象,變量引用的對(duì)象的地址也不會(huì)變化,不過(guò)對(duì)于相同的值的不同對(duì)象,在內(nèi)存中則會(huì)存在不同的對(duì)象,即每個(gè)對(duì)象都有自己的地址,相當(dāng)于內(nèi)存中對(duì)于同值的對(duì)象保存了多份,這里不存在引用計(jì)數(shù),是實(shí)實(shí)在在的對(duì)象。
可變類(lèi)型對(duì)于相同的值而對(duì)象不同的示例:
In [1]: a = [11,22]In [2]: b = [11,22]In [3]: id(a) Out[3]: 140404737889544In [4]: id(b) Out[4]: 140404737846984In [5]: # 相同的值而不同的對(duì)象保存了多份
引用傳參
?
? 可變類(lèi)型與不可變類(lèi)型的變量分別作為函數(shù)參數(shù)時(shí),會(huì)有什么不同嗎?
? Python有沒(méi)有類(lèi)似C語(yǔ)言中的指針傳參呢?
?
示例
?
>>> def selfAdd(a): ... """自增""" ... a += a ... >>> a_int = 1 >>> a_int 1 >>> selfAdd(a_int) >>> a_int 1 # 注意結(jié)果沒(méi)有變化 >>> a_list = [1, 2] >>> a_list [1, 2] >>> selfAdd(a_list) >>> a_list [1, 2, 1, 2] # 注意結(jié)果發(fā)生了變化?
總結(jié):
Python中函數(shù)參數(shù)是引用傳遞(注意不是值傳遞)。對(duì)于不可變類(lèi)型,因變量的值不能修改,所以運(yùn)算不會(huì)影響到變量自身;而對(duì)于可變類(lèi)型來(lái)說(shuō),函數(shù)體中的運(yùn)算有可能會(huì)更改傳入的參數(shù)變量的值。
?
轉(zhuǎn)載于:https://www.cnblogs.com/kayb/p/7223415.html
總結(jié)
以上是生活随笔為你收集整理的Python当中的a += a 与 a = a + a 的区别,可变类型与不可变类型的数据类型,引用传参...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: MyBatis延迟加载和缓存(4)
- 下一篇: python List交集、并集、差集