对序列进行+,*, +=,*=运算

本文详细探讨了Python中序列类型的*、+、*=、+=运算符的使用逻辑,特别是对可变序列的影响。通过实例说明了*运算可能导致的元素引用问题,以及+=和*=在可变序列上的不同行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python的序列类型支持 *,+,*=, +=

*, + 的操作逻辑都是创建新变量然后重新赋值,所以变量id将会改变。这毫无疑问,尤其是对于不可变类型。
需要注意的是,*运算对各个元素执行的是复制操作,某些时候可能导致错误

x =[[]]*3  #导致三个元素指向同一列表
x[0].append(1) # [[1], [1], [1]]

如果存储的元素是不可变类型,这个问题几乎可以不用担心,因为任何改动都是不合法的或者会创建新的变量,所以不存在相互影响。

+=和*=的操作逻辑基本相同的。+=先检查运算符左侧是否实现__iadd__方法,如果没有调用__add__。
但是可变序列__iadd__和__add__的实现有很大不同。
__add__,等价于a = a + b,会改变内存地址

__iadd__,等价于a.extend(b), 不会改变内存地址

对内置可变序列类型, a*=2 等价于__imul__, 同样不会改变内存地址。内部的执行逻辑可能是(没查过代码)创建新的序列后,使用extend加入到原序列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值