You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何修改numpy数组迭代行对象会同步更新原数组?

问题:修改遍历numpy数组的行为何会改变原数组?

我的代码

函数定义:

def invert_blackwhite(x):
    for riga in x:
        for idx_colonna in range(len(riga)):
            if (riga[idx_colonna] == 0):
                riga[idx_colonna] = 1
            else:
                riga[idx_colonna] = 0            
        print(riga)
    return x

调用代码:

import numpy as np
x = np.array([[0,1,0],[1,1,1],[0,1,0],[0,1,0]])
invert_blackwhite(x)

输出结果:

[1 0 1]
[0 0 0]
[1 0 1]
[1 0 1]

我的困惑

我在函数里遍历数组的行,只操作riga对象,但原变量x也被更新了,不清楚修改riga为何会同步更新x,希望得到解答。


解答

这是因为numpy数组的行是原数组的视图(view),而非副本(copy)。

当你用for riga in x遍历numpy二维数组时,每次迭代拿到的riga并不是独立的新数组,而是指向原数组x中对应行数据的引用——riga和原数组x共享同一块内存空间。

所以当你修改riga里的元素时,本质上是直接修改了原数组x对应位置的内存数据,自然会看到原数组x被同步更新。

如果想避免修改原数组,可以在遍历前先创建原数组的副本,或者在遍历行的时候显式生成行的副本,比如:

def invert_blackwhite(x):
    # 先创建原数组的副本,避免修改原数据
    x_copy = x.copy()
    for riga in x_copy:
        for idx_colonna in range(len(riga)):
            riga[idx_colonna] = 1 - riga[idx_colonna]
        print(riga)
    return x_copy

或者用更高效的numpy原生操作替代循环:

def invert_blackwhite(x):
    x_copy = 1 - x
    for row in x_copy:
        print(row)
    return x_copy

内容的提问来源于stack exchange,提问作者CrazyHorse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 11:00:55