为何数组元素被覆盖?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
相关产品推荐
相关产品推荐

