Python整数+=操作无对应__iadd__方法的实现原理及调用方案问询
Python整数
+=运算符原理及无赋值场景累加方案 1. 整数+=的工作机制
int属于Python内置不可变类型,所有不可变类型都没有实现__iadd__这类原地修改的魔法方法。
解释器执行a += b时的处理逻辑如下:
- 优先调用对象的
__iadd__方法,若存在则执行原地修改,返回对象本身 - 若
__iadd__不存在,就降级为调用__add__方法拿到运算结果,再执行赋值操作将新结果绑定到原变量
也就是说对整数来说,a += 2完全等价于a = a.__add__(2),运算会生成新的整数对象,再重新绑定到变量a上,所以直接调用a.__iadd__(2)会抛出属性不存在的异常。
2. 无赋值运算符场景的累加实现
如果场景限制只能使用方法调用、不能使用=运算符,你无法直接修改int类型变量——因为不可变类型的数值变更必须重新绑定变量,本质就需要用到赋值。此时可以借助可变容器存储累加值,通过方法调用修改容器内的元素完成累加:
示例代码(无需引入额外模块)
用长度为1的列表存储累加值(列表是可变类型,支持原地修改),调用列表自带的__setitem__方法和整数的__add__方法实现:
>>> a = [0] >>> summands = [1, 4, 5, 7, 9] >>> [a.__setitem__(0, a[0].__add__(i)) for i in summands] >>> print(a[0]) 26
你示例中的代码运行结果异常,是因为整数本身不存在__iadd__方法,且参数传递逻辑错误,即便方法存在也无法得到正确结果。
内容的提问来源于stack exchange,提问作者B.R.
相关产品推荐
相关产品推荐

