簡體   English   中英

將Python分配給第三個變量時為+ =

[英]+= in Python when assigning it to third variable

當我查看Python中+ =運算符的含義時,我看到了一個類似問題的答案: + =在python中到底做什么? 但是在下面的代碼摘錄中:

increments += arr[i-1] - arr[i]

使用了第三個變量。 如果我理解該概念,它將從arr[i-1]減去arr[i]並將其添加到increments的值,並將結果分配給increments 詳細說明:上面的陳述是否類似於

increments = increments + (arr[i-1] - arr[i])

還是還有更多?

文檔中

擴充賦值評估目標(與普通賦值語句不同,不能解包)和表達式列表,對兩個操作數執行特定於賦值類型的二進制運算,並將結果賦值給原始目標。 該目標僅評估一次。

可以將x += 1類的增強賦值表達式重寫為x = x + 1以獲得相似但不完全相等的效果。 在增強版本中, x僅被評估一次。 同樣,在可能的情況下,實際操作將在原地執行,這意味着不是創建新對象並將其分配給目標,而是修改了舊對象。

與普通分配不同,擴充分配在評估右側之前先評估左側。 例如, a[i] += f(x)首先查找a[i] ,然后求值f(x)並執行加法,最后將結果寫回到a[i]

除了在單個語句中分配給元組和多個目標外,由擴展賦值語句完成的賦值與普通賦值的處理方式相同。 類似地,除了可能的就地行為外,通過擴充分配執行的二進制操作與常規二進制操作相同。

對於作為屬性引用的目標,關於類和實例屬性的警告同樣適用於常規分配。

(我在第二段中強調)

因此,是的,它的意義不僅僅只是increments = increments + (arr[i-1] - arr[i]) 重要的程度取決於您要應用運算符的對象。

詳細說明:上面的陳述是否類似於

增量=增量+(arr [i-1]-arr [i])

這取決於“增量”的類型。

關於核心內置類型(以及其他嘗試遵循其設置的模式的類型),在+和+ =之間至少存在兩個明顯的區別。

  1. 如果類型是可變的,則+ =就地執行修改,而+創建新對象。
  2. 對於列表+ =比+更靈活,+僅接受另一個列表,而+ =將接受任何可迭代的列表。

數字是不可變的,因此對於數字,兩個語句的行為相同。 但是,有趣的是,我們是否能夠找出某些情況下它們的行為有所不同。

我們可以使用的類型非常有限,因為支持“ +”和“-”的類型相對較少,並且大多數類型僅支持相同類型的操作。 使增量成為列表和使arr集的元素組合在一起是證明差異的一種方法。

increments=[]
i = 1 
arr=[{"foo","bar"},{"bar","baz"}]
increments += arr[i-1] - arr[i]
print(increments)

“打印['foo']”

increments=[]
i = 1 
arr=[{"foo","bar"},{"bar","baz"}]
increments = increments + (arr[i-1] - arr[i])
print(increments)

引發異常“ TypeError:只能將列表(而不是“ set”)連接到列表”

但這是一個相當人為的示例,對於更實際的事情,我們需要一個可變的類型並同時支持“ +”和“-”的類型。 我認為核心內置類型中沒有任何此類類型,但是一種廣泛使用的類型是numpy中的“數組”類型。

from numpy import array
increments=array((1,2))
oldincrements=increments
i = 1 
arr=[array((3,4)),array((5,6))]
increments += arr[i-1] - arr[i]
print(repr(oldincrements)+' '+repr(increments))

打印“ array([-1,0])array([-1,0])”。 numpy數組已就地修改,因此“ oldincrements”和“ increment”都受到影響。

from numpy import array
increments=array((1,2))
oldincrements=increments
i = 1 
arr=[array((3,4)),array((5,6))]
increments = increments + (arr[i-1] - arr[i])
print(repr(oldincrements)+' '+repr(increments))

打印“ array([1,2])array([-1,0])”,增量所指向的數組未就地修改,而是創建了一個新數組並將其分配給“增量”。 因此,“舊增量”不受影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM