首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Python的"&=“集合运算符和"&=”整数运算的行为不同?

为什么Python的"&=“集合运算符和"&=”整数运算的行为不同?
EN

Stack Overflow用户
提问于 2016-04-17 01:42:25
回答 1查看 70关注 0票数 5

为什么此set操作会更改set s?对于相同运算符的整数(按位)版本,它不会以相同的方式工作。

设置操作&= (更改s):

代码语言:javascript
复制
s = set('abc')
t = set('bcd')
u=s
print u, s, t
u &= t
print u, s, t

结果:

代码语言:javascript
复制
set(['a', 'c', 'b']) set(['a', 'c', 'b']) set(['c', 'b', 'd'])

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

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

代码语言:javascript
复制
s = 7
t = 3
u=s
print u, s, t
u &= t
print u, s, t

结果:

代码语言:javascript
复制
7 7 3

3 7 3
EN

回答 1

Stack Overflow用户

发布于 2016-04-17 03:34:58

Integer实现了&操作,但没有实现&=操作,所以当您使用x &= y时,它会扩展为x = x & y,它只是简单地重新分配x变量,而不是修改它的内部状态(对于&来说,改变一个值没有多大意义,就像它对+没有意义一样)。frozensets也是如此。

Set实现了&=操作,因此它不会扩展为变量重新赋值,而是改变运算符的左侧。

元组既不实现&,也不实现&=,因此出现错误是有意义的。然而,使用+=会得到相同的效果:对于元组,+=是扩展的,对于列表,它是一种原地突变,因为列表是可变的。

任何类都可以实现它们自己版本的这些运算符。详情请参见here。特别是,&对应于__and__&=对应于__iand__

如果你仔细想想,对于可变类来说,实现就地运算符以允许直接修改是一个明智的约定,而不是不可变的类。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36667517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档