Python嵌套循环修改嵌套列表元素未更新如何解决
问题原因
嵌套循环不生效的核心原因是:直接遍历列表元素时,item = item * -1 只是给循环内部的临时变量item重新绑定了新值,没有修改原列表对应位置存储的元素,循环结束后临时变量销毁,原列表自然没有任何变化。
你直接打印b * -1能看到正确结果,是因为这行代码确实计算出了取反后的新值,但你只是把计算结果打印输出,没有写回原数据的对应位置,所以原数据不会更新。
修复方案
根据你的数据类型选择对应实现即可:
- 如果是普通Python嵌套列表:不要直接给遍历出的元素变量赋值,需要通过索引定位到原列表的对应位置,修改位置上存储的值,两种常用写法如下:
# 写法1:纯索引遍历 for level1 in range(len(data)): for level2 in range(len(data[level1])): for level3 in range(len(data[level1][level2])): for idx in range(len(data[level1][level2][level3])): data[level1][level2][level3][idx] *= -1
# 写法2:用enumerate同时拿到索引和值,代码更简洁 for i, val1 in enumerate(data): for j, val2 in enumerate(val1): for k, val3 in enumerate(val2): for l, item in enumerate(val3): data[i][j][k][l] = item * -1
- 从你打印的原始数据格式(元素间无逗号、长内容自动用
...省略)判断,你的数据大概率是NumPy数组,这种情况不需要手写嵌套循环,直接用NumPy的向量化运算即可,运行效率远高于手写循环:
# 方式1:生成取反后的新数组赋值回原变量 data = -data # 方式2:原地做取反操作,不生成新数组,内存占用更低 # data *= -1
内容的提问来源于stack exchange,提问作者Dirk Kuiper
相关产品推荐
相关产品推荐

