Python中替换嵌套列表值遇问题:代码执行结果异常求助
问题描述
我运行以下Python代码未得到预期结果,怀疑问题出在嵌套列表的数值修改上。
预期结果是每次迭代生成不同的子列表,如[[e, r], [h, j], [x, y]],但实际所有子列表都是最后一次的数值,形如[[x, y], [x, y], [x, y]]。我尝试用x[k][i]操作嵌套列表元素,但效果不佳,恳请帮忙解决。
代码如下:
def f(x1,x2): return 1.5*(x1)**2+0.5*(x2**2)-x1*x2-2*x1 def f_tag_x1 (lst): x2=lst[1] x1=lst[0] return -((3*x1-x2-2)/3) def f_tag_x2 (lst): x2=lst[1] x1=lst[0] return (x1-x2) demsions=2 k=1 x=[[-2,4]] ftags=[f_tag_x1,f_tag_x2] while (k<3): x.append(x[k-1]) for i in range(0,demsions): if i==0: x[k][i]=(x[k-1][i]+ftags[i](x[k-1])) else: x[k][i]=(x[k][i]+ftags[i](x[k])) k=k+1 print(x)
问题原因与解决方法
- 核心问题:
x.append(x[k-1])没有创建新的列表,只是把原列表的引用添加到了外层列表。后续修改x[k]时,所有指向该列表对象的引用都会同步更新,导致最终所有子列表显示的都是最后一次修改的结果。 - 解决办法:添加子列表时必须创建原列表的副本,而非直接引用,常用的几种方式:
- 使用列表的
copy()方法:x.append(x[k-1].copy()) - 使用切片操作生成副本:
x.append(x[k-1][:]) - 使用
list()构造函数:x.append(list(x[k-1]))
- 使用列表的
修改后的代码示例:
def f(x1,x2): return 1.5*(x1)**2+0.5*(x2**2)-x1*x2-2*x1 def f_tag_x1 (lst): x2=lst[1] x1=lst[0] return -((3*x1-x2-2)/3) def f_tag_x2 (lst): x2=lst[1] x1=lst[0] return (x1-x2) demsions=2 k=1 x=[[-2,4]] ftags=[f_tag_x1,f_tag_x2] while (k<3): # 创建原列表的副本,避免引用同一对象 x.append(x[k-1].copy()) for i in range(0,demsions): if i==0: x[k][i]=(x[k-1][i]+ftags[i](x[k-1])) else: x[k][i]=(x[k][i]+ftags[i](x[k])) k=k+1 print(x)
运行修改后的代码,即可得到每次迭代独立的子列表,符合预期结果。
内容的提问来源于stack exchange,提问作者Itay Zaada
相关产品推荐
相关产品推荐

