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

首頁 > 編程 > Python > 正文

python中a+=b與a=a+b有什么區(qū)別

2019-11-06 06:50:54
字體:
供稿:網(wǎng)友

看到一個比較有意思的問題,就是python中a+=b與a=a+b有什么區(qū)別

鏈接: http://stackoverflow.com/questions/6951792/python-a-b-not-the-same-as-a-a-b

總體上講,a+=b是改變了a原始的值,而a=a+b是計算出a+b后,a在指向那個值。這個也跟a和b的類型有關(guān)。當(dāng)a和b是int或者string不可改變的時候,二者效果一樣。

>>> a=[1,2,3,4] >>> b=a >>> a+=[5] >>> a,b ([1, 2, 3, 4, 5], [1, 2, 3, 4, 5])#a,b的“地址”一樣 >>> a=[1,2,3,4] >>> b=a >>> a=a+[5]#a+[5]后有一個新地址,再使a指向這個新地址,因此a不再是以前的a,而b還是以前的那個a//b,所以b不變 >>> a,b ([1, 2, 3, 4, 5], [1, 2, 3, 4])
>>> a=[[1],[2]] >>> b=[] >>> b+=a[0:1]#這句將列表a中第一個元素的“指針”給了b[0],此時a[0]和b[0]是一樣的 >>> a,b ([[1], [2]], [[1]]) >>> b[0][0]='change'#b[0]就相當(dāng)于取到了a里面的第一個元素,也是一個列表。b[0][0]也就定位到了a[0][0],對應(yīng)的內(nèi)容就是1 >>> a,b ([['change'], [2]], [['change']])#因此b[0][0]改了,a[0][0],也相應(yīng)的改了。 >>> id(b[0][0]);id(a[0][0])#不用說,地址一樣 11534048 11534048 >>> id(b[0]);id(a[0]) 12903888 12903888 >>> b[0],a[0] (['change'], ['change']) >>> b[0]='another'#這里應(yīng)該是有一塊新地址,再讓b[0]指向這個新地址。  >>> a,b ([['change'], [2]], ['another'])# 因此a中的值沒有變>>> a[0] ['change'] >>> id(b[0]);id(a[0]) #此時,b[0]跟a[0]的地址不一樣13056672 12903888
>>> a=[1,2]#初始化a,為列表[1,2]>>> a+='3' #直接+=方式,追加元素”3”>>> a[1, 2, '3']>>> a+=['4'] #追加列表,比上面的‘3’ 多了個[]。>>> a[1, 2, '3', '4']#同樣能追加成功,怎么感覺有無[]沒有區(qū)別啊?>>> a+'5'#當(dāng)然,直接+字符串,就拋異常了。Traceback (most recent call last):  File "<stdin>", line 1, in <module>TypeError: can only concatenate list (not "str") to list

要解釋這個問題,看看python里的源碼即可。知道+=這個操作實際上是調(diào)用了__iadd__方法(可以用此重載操作符,stackoverflow上有這個重載+=的問題).而在__iadd__方法內(nèi)部,是直接調(diào)用了extend()方法,而a.extend(‘3’)和a.extend([‘3’])沒有區(qū)別嗎?表面上看來是沒有區(qū)別的。

>>> a=[1,2]>>> a.extend('3')>>> a[1, 2, '3']>>> a.extend(['3'])>>> a[1, 2, '3', '3']而實際上,在extend(arg)方法內(nèi)部,又去調(diào)用了append方法

def extend(self, values):        for v in values:            self.append(v)

這樣,’3’ 和 [‘3’] 就沒區(qū)別被append進(jìn)去了。字符串會被當(dāng)作數(shù)組append進(jìn)去。

>>> a[1, 2, '3', '3']>>> a.extend('abc')>>> a[1, 2, '3', '3', 'a', 'b', 'c']>>> a.extend(['23','ab'])>>> a[1, 2, '3', '3', 'a', 'b', 'c', '23', 'ab']參考文獻(xiàn):

http://stackoverflow.com/questions/6951792/python-a-b-not-the-same-as-a-a-b

https://my.oschina.net/sukai/blog/616652


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 浪卡子县| 砀山县| 休宁县| 建德市| 垦利县| 渝中区| 堆龙德庆县| 长宁县| 闸北区| 巴彦县| 安新县| 华阴市| 河池市| 垣曲县| 西安市| 桂林市| 台南市| 澜沧| 彭州市| 邵阳市| 安塞县| 绥中县| 平乐县| 扎囊县| 西和县| 晋中市| 德清县| 林西县| 漠河县| 五台县| 都兰县| 浪卡子县| 黑龙江省| 大同县| 霸州市| 阳谷县| 呼和浩特市| 敖汉旗| 方正县| 友谊县| 阜新市|