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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 11:27:38