2016-04-16 77 views
5

爲什麼此設置操作更改集s?它不爲同一運營商的整數(按位)版本相同的方式工作....爲什麼Python「&=」set操作符的操作與「&=」整數操作的操作不同?

設置操作&=(改變s):

s = set('abc') 
t = set('bcd') 
u=s 
print u, s, t 
u &= t 
print u, s, t 

結果:

set(['a', 'c', 'b']) set(['a', 'c', 'b']) set(['c', 'b', 'd']) 

set(['c', 'b']) set(['c', 'b']) set(['c', 'b', 'd']) 

按位操作&=(不更改s):

s = 7 
t = 3 
u=s 
print u, s, t 
u &= t 
print u, s, t 

結果:

7 7 3 

3 7 3 
+7

集合是可變的,整數不是。用'frozenset'嘗試一下。 – jonrsharpe

+0

它與frozensets預期的一樣。所以,這個操作並不是試圖在原地修改set u(與聲明開頭的s相同的對象),否則會導致異常。它試圖做什麼? –

+0

列表顯示與&=相同的行爲。元組導致TypeError。 –

回答

5

整數實現&操作,但不是&=操作,所以當你使用它x &= y擴大到x = x & y它只是重新分配x變量,而不是修改其內部狀態(它不會使對於&來說很有意義,因爲它對+沒有意義)。同樣的frozensets。

設置執行&=操作,所以它不擴展到變量重新分配,而是改變操作符的左側。

元組既不實施&也不&=所以錯誤是有道理的。然而,你可以得到與+=相同的效果:對於元組+=進行了擴展,對於列表來說這是一個就地變化,因爲列表是可變的。

任何類都可以實現它們自己的這些運算符版本。詳情請參閱here。特別是&對應於__and__&=__iand__

如果你仔細想想,這是一個明智的約定,可變類實現原地運算符以允許直接修改,但不是不可變類。

+0

謝謝。您在https://docs.python.org/2/reference/simple_stmts.html的Python 2.7.11文檔中向我提供了足夠的信息以找到「Augmented Assignment」,PEP-203和我的答案。 –