Python中*=运算符对整数和NumPy数组表现不同的原因是什么
Python中
*=运算符在整数与NumPy数组场景下的行为差异解析 首先可以明确:这种差异和print语句的执行顺序无关,也不存在数组转整数的逻辑,核心原因是Python对象的可变性差异,以及就地运算符的实现规则:
- 不可变对象(整数)场景的逻辑
Python的int类型属于不可变对象,针对不可变对象的*=运算本质等价于a = a * 2:运算时会先生成一个新的整数对象,再将变量a的引用指向这个新对象。而变量b始终指向最初的整数对象1,因此不会随a的赋值发生变化。 - 可变对象(NumPy数组)场景的逻辑
NumPy数组属于可变对象,它的*=运算符是直接修改原数组内存中存储的数值,不会生成新的数组对象。代码中b = a只是给原数组起了一个别名,两个变量指向的是内存中的同一个数组,因此修改a指向的数组内容时,b读取到的内容也会同步变化。
你可以通过id()函数查看变量指向的内存地址验证上述逻辑:
整数场景验证
a = 1 b = a print(id(a) == id(b)) # 输出True,初始阶段两个变量指向同一对象 a *= 2 print(id(a) == id(b)) # 输出False,a已经指向新生成的整数对象
NumPy数组场景验证
import numpy as np a = np.array([1,2,3]) b = a print(id(a) == id(b)) # 输出True,初始阶段两个变量指向同一数组 a *= 2 print(id(a) == id(b)) # 输出True,a没有更换指向对象,仅修改了原数组内容
如果希望NumPy数组赋值后互不影响,可以显式调用拷贝方法生成新数组:b = a.copy(),后续修改a就不会改动b的内容。
内容的提问来源于stack exchange,提问作者spokati
相关产品推荐
相关产品推荐

