Python append方法异常:添加列表后数组元素全部同步更新
问题描述
我正在使用trinket.io这款Python3在线IDE,无法使用其他可下载的IDE。尝试通过循环与条件语句创建数组时,打印单个row列表能得到预期结果,但将其append到array后,数组中所有行都会同步更新为当前循环的row内容。
代码示例
import numpy as np import matplotlib.pyplot as plt from sympy import * x = Symbol('x') y = Function('f')(x) # Equation is ay_(n-1) + by_n + cy_(n+1) = d a = 3 b = 4 c = 6 d = 4 # Final row equation: ey_(n-2)+fy_(n-1)+gy_(n) = d e = 5 f = 3 g = 7 # Timestep h = 0.2 # Initialize variables y_0 = 0 final_point = 1 array = [] row = [] i = 1 array_row_size = int(final_point / h) array_column_size = array_row_size + 1 for i in range(1, array_row_size + 1): row.clear() if i == 1: row.append(b) row.append(c) for j in range(2, array_column_size - 1): row.append(0) row.append(d) elif i == 2: row.append(a) row.append(b) row.append(c) for j in range(3, array_column_size - 1): row.append(0) row.append(d) elif i < (array_column_size - 1) and i > 2: for j in range(2, i): row.append(0) row.append(a) row.append(b) row.append(c) for j in range(i + 1, array_column_size - 1): row.append(0) row.append(d) else: for j in range(1, array_column_size - 3): row.append(0) row.append(e) row.append(f) row.append(g) row.append(d) array.append(row) print("Row:", row) print("Array", array) i += 1 # print(array)
运行结果
Row: [4, 6, 0, 0, 0, 4] Array [[4, 6, 0, 0, 0, 4]] Row: [3, 4, 6, 0, 0, 4] Array [[3, 4, 6, 0, 0, 4], [3, 4, 6, 0, 0, 4]] Row: [0, 3, 4, 6, 0, 4] Array [[0, 3, 4, 6, 0, 4], [0, 3, 4, 6, 0, 4], [0, 3, 4, 6, 0, 4]] Row: [0, 0, 3, 4, 6, 4] Array [[0, 0, 3, 4, 6, 4], [0, 0, 3, 4, 6, 4], [0, 0, 3, 4, 6, 4], [0, 0, 3, 4, 6, 4]] Row: [0, 0, 5, 3, 7, 4] Array [[0, 0, 5, 3, 7, 4], [0, 0, 5, 3, 7, 4], [0, 0, 5, 3, 7, 4], [0, 0, 5, 3, 7, 4], [0, 0, 5, 3, 7, 4]]
问题原因与解决方法
原因
循环中始终复用同一个row列表对象:调用row.clear()仅清空列表内容,但列表本身的内存引用未改变。将row添加到array时,实际添加的是该列表的引用,而非独立副本。后续修改row内容时,数组中所有指向该引用的元素都会同步变化。
解决方法
有两种可行方案:
方案1:每次循环创建新列表
移除提前初始化的row = [],在每次循环开始时创建新的空列表,替代row.clear()操作:
array = [] # 移除这里的row = [] i = 1 array_row_size = int(final_point / h) array_column_size = array_row_size + 1 for i in range(1, array_row_size + 1): # 每次循环创建新的row列表 row = [] if i == 1: row.append(b) row.append(c) for j in range(2, array_column_size - 1): row.append(0) row.append(d) # 后续elif/else逻辑保持不变 array.append(row) print("Row:", row) print("Array", array)
方案2:添加列表副本到数组
保留原结构,在append时添加row的副本,而非原引用:
# 替换原有的array.append(row) array.append(row.copy())
两种方案都能确保数组中每行都是独立的列表,后续修改row不会影响已存入数组的内容。
内容的提问来源于stack exchange,提问作者user30200039
相关产品推荐
相关产品推荐

