第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么+=在列表上表現(xiàn)得出乎意料?

為什么+=在列表上表現(xiàn)得出乎意料?

BIG陽 2019-06-12 15:15:39
為什么+=在列表上表現(xiàn)得出乎意料?這個+=python中的運算符似乎意外地在列表上操作。有人能告訴我這是怎么回事嗎?class foo:        bar = []      def __init__(self,x):          self.bar += [x]class foo2:      bar = []      def __init__(self,x):           self.bar = self.bar + [x]f = foo(1)g = foo(2)print f.barprint g.bar  f.bar += [3]print f.barprint g.bar f.bar = f.bar + [4]print f.barprint g.bar f = foo2(1)g = foo2(2)print f.bar  print g.bar輸出量[1, 2][1, 2][1, 2, 3][1, 2, 3][1, 2, 3, 4][1, 2, 3][1][2]foo += bar似乎影響到類的每個實例,而foo = foo + bar看上去就像我所期望的那樣。這個+=運算符被稱為“復合賦值運算符”。
查看完整描述

3 回答

?
POPMUISE

TA貢獻1765條經驗 獲得超5個贊

一般的答案是+=試圖調用__iadd__方法,如果無法使用該方法,則嘗試使用__add__相反。所以問題在于這些特殊方法之間的區(qū)別。

這個__iadd__特殊方法是用于就地添加的,即它對其作用的對象進行變異。這個__add__特殊方法返回一個新對象,并用于標準+接線員。

所以當+=運算符用于具有__iadd__定義的對象被修改到位。否則,它將嘗試使用普通的__add__并返回一個新對象。

這就是為什么對于列表這樣的可變類型+=更改對象的值,而對于元組、字符串和整數(shù)等不可變類型,則返回一個新對象(a += b變得等價于a = a + b).

對于支持這兩種類型的類型__iadd____add__因此,你必須小心使用哪一個。a += b會打電話__iadd__突變a,鑒于a = a + b將創(chuàng)建一個新對象并將其分配給a..他們不是同一個行動!

>>> a1 = a2 = [1, 2]>>> b1 = b2 = [1, 2]>>> a1 += [3]          # Uses __iadd__, modifies a1 in-place>>> b1 = b1 + [3]      
# Uses __add__, creates new list, assigns it to b1>>> a2[1, 2, 3]              
# a1 and a2 are still the same list>>> b2[1, 2]                 # whereas only b1 was changed

對于不可變類型(在該類型中,您沒有__iadd__a += ba = a + b都是等價物。這就是讓你使用的東西+=對于不可變的類型,這似乎是一個奇怪的設計決策,直到您考慮到否則您無法使用+=像數(shù)字這樣的不可變的類型!


查看完整回答
反對 回復 2019-06-12
  • 3 回答
  • 0 關注
  • 335 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號