Python中对Numpy切片数组执行元组赋值的运行机制是什么?
你的理解完全正确。
我们可以拆解整个执行逻辑验证:
- 普通变量交换
a, b = b, a能正常工作的前提是,右侧先完成所有求值,拿到b、a指向的对象引用打包为元组,再依次修改左侧变量的指向,全程不会修改对象本身的内容。 - NumPy的切片和普通变量不同,切片返回的不是独立新数组,是原数组的视图,本质就是指向原数组对应内存区间的引用,不会主动拷贝底层数据。
- 你写的交换语句执行流程如下:
- 首先对右侧表达式求值,得到两个视图对象:分别指向原数组的后2个元素、原数组的前2个元素,此时还没有发生任何数据修改
- 多目标赋值按从左到右的顺序执行:先把第一个右侧值(后2个元素视图对应的数据)写入
a[:2]对应的内存,此时原数组的前2个元素已经被覆盖为原后2个元素的值 - 接下来给
a[2:]赋值,此时第二个右侧值是指向原数组前2个元素的视图,读取到的已经是刚修改后的新值,写入后2个元素的位置后,最终前后两半的值就完全一致了。
如果要实现预期的交换效果,只需要在右侧求值时强制拷贝切片的数据,避免使用视图即可:
a[:2], a[2:] = a[2:].copy(), a[:2].copy()
也可以直接拼接生成新数组赋值给原变量:
a = np.concatenate([a[2:], a[:2]])
内容的提问来源于stack exchange,提问作者ihdv
相关产品推荐
相关产品推荐

