Why does this set operation change set s? It does not work the same way for the integer (bitwise) version of the same operator....
Set Operation &= (changes s):
s = set('abc')
t = set('bcd')
u=s
print u, s, t
u &= t
print u, s, t
results:
set(['a', 'c', 'b']) set(['a', 'c', 'b']) set(['c', 'b', 'd'])
set(['c', 'b']) set(['c', 'b']) set(['c', 'b', 'd'])
Bitwise operation &= (does not change s):
s = 7
t = 3
u=s
print u, s, t
u &= t
print u, s, t
Result:
7 7 3
3 7 3
Integers implement the & operation but not the &= operation, so when you use x &= y it is expanded to x = x & y which simply reassigns the x variable rather than modifying its internal state (it wouldn't make much sense for & to mutate a value, just like it wouldn't make sense for +). Same for frozensets.
Sets implement the &= operation so it's not expanded to a variable reassignment but rather mutates the left hand side of the operator.
Tuples implement neither & nor &= so an error makes sense. However you get the same effect with +=: for tuples += is expanded, for lists it's an in-place mutation because lists are mutable.
Any class can implement their own version of these operators. See here for details. In particular & corresponds to __and__ and &= to __iand__.
If you think about it, it's a sensible convention for mutable classes to implement the in-place operators to allow direct modification, but not immutable classes.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With