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

为何数组元素被覆盖?Python数组相似性判断函数异常排查

Why does array b get modified even when I didn't intend to perform calculations on it?

我编写了一个Python简单函数,用于判断两个数组a和b是否可通过最多交换其中一个数组的一对元素得到彼此。函数代码如下:

def areSimilar(a, b):
    test = 0
    for i in range(len(b)):
        for j in range(len(b)):
            b2 = b
            b2[i] = b[j]
            b2[j] = b[i]
            if a == b2:
                test = 1
    return(test==1)

问题是,我并未对数组b执行计算操作,但检查时发现b已被修改,请问这是怎么回事?

这是Python里引用赋值的典型陷阱!你写的b2 = b根本不是复制数组,而是让b2和b指向了内存里的同一个列表对象。

打个通俗的比方:你有一个抽屉,原先是贴了标签b,现在你给这个抽屉又贴了个新标签b2——不管你用哪个标签打开抽屉、修改里面的东西,本质上都是在操作同一个抽屉里的内容。

所以当你执行b2[i] = b[j]和b2[j] = b[i]的时候,你其实直接修改了原来的b数组,因为b2只是b的一个“别名”,它们共享同一块内存地址。

要解决这个问题,你需要创建原列表的真实副本,而不是引用。常见的实现方法有这几种:

  • 使用切片语法:b2 = b[:],这会生成一个包含原列表所有元素的新列表
  • 使用list()构造函数:b2 = list(b)
  • 借助copy模块的浅拷贝方法:import copy; b2 = copy.copy(b)

另外顺便提一句,你的双重循环写法效率偏低,其实可以先找出两个数组中元素不同的位置,再判断这些位置的数量是0(已经相等)或者2(交换后匹配)——不过这是额外的优化建议,先解决你当前的核心问题更关键。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 20:02:39