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

Python列表追加异常:所有元素被最后一项覆盖问题排查

问题分析与解决

问题描述

我有一个包含多笔交易的字符串,交易间以;,;和不规则空格分隔。将字符串分割为每个元素对应一笔交易的列表时,通过print()验证结果符合预期,但清理完列表后打印发现所有交易都被最后一项覆盖,不知问题出在哪。

原代码

daily_sales = \
"""Edith Mcbride   ;,;$1.21   ;,;   white ;,;
09/15/17   ,Herbert Tran   ;,;   $7.29;,;
white&blue;,;   09/15/17 ,Paul Clarke ;,;$12.52
;,;   white&blue ;,; 09/15/17 ,Lucille Caldwell
;,;   $5.13   ;,; white   ;,; 09/15/17,
Eduardo George   ;,;$20.39;,; white&yellow
;,;09/15/17   ,   Danny Mclaughlin;,;$30.82;,;
purple ;,;09/15/17 ,Stacy Vargas;,; $1.85   ;,;
purple&yellow ;,;09/15/17,   Shaun Brock;,;
$17.98;,;purple&yellow ;,; 09/15/17 ,
Erick Harper ;,;$17.41;,; blue ;,; 09/15/17,
Michelle Howell ;,;$28.59;,; blue;,;   09/15/17   ,
Carroll Boyd;,; $14.51;,;   purple&blue   ;,;
09/15/17   , Teresa Carter   ;,; $19.64 ;,;
white;,;09/15/17   ,   Jacob Kennedy ;,; $11.40
;,; white&red   ;,; 09/15/17, Craig Chambers;,;
$8.79 ;,; white&blue&red   ;,;09/15/17   , Peggy Bell;,; $8.65 ;,;blue   ;,; 09/15/17,   Kenneth Cunningham ;,;   $10.53;,;   green&blue   ;,;
09/15/17   ,   Marvin Morgan;,;   $16.49;,;
green&blue&red   ;,;   09/15/17 ,Marjorie Russell
;,; $6.55 ;,;   green&blue&red;,;   09/15/17 ,
Israel Cummings;,;   $11.86   ;,;black;,;
09/15/17,   June Doyle   ;,;   $22.29 ;,;
black&yellow ;,;09/15/17 , Jaime Buchanan   ;,;
$8.35;,;   white&black&yellow   ;,;   09/15/17,
Rhonda Farmer;,;$2.91 ;,;   white&black&yellow
;,;09/15/17, Darren Mckenzie ;,;$22.94;,;green
;,;09/15/17,Rufus Malone;,;$4.70   ;,; green&yellow
;,; 09/15/17   ,Hubert Miles;,;   $3.59
;,;green&yellow&blue;,;   09/15/17   , Joseph Bridges  ;,;$5.66   ;,; green&yellow&purple&blue
;,;   09/15/17 , Sergio Murphy   ;,;$17.51   ;,;
black   ;,;   09/15/17 , Audrey Ferguson ;,;
$5.54;,;black&blue   ;,;09/15/17 ,Edna Williams ;,;
$17.13;,; black&blue;,;   09/15/17,   Randy Fleming;,;   $21.13 ;,;black ;,;09/15/17 ,Elisa Hart;,; $0.35   ;,; black&purple;,;   09/15/17   ,
Ernesto Hunt ;,; $13.91   ;,;   black&purple ;,;
09/15/17,   Shannon Chavez   ;,;$19.26   ;,;
yellow;,; 09/15/17   , Sammy Cain;,; $5.45;,;
yellow&red ;,;09/15/17 ,   Steven Reeves ;,;$5.50
;,;   yellow;,;   09/15/17, Ruben Jones   ;,;
$14.56 ;,;   yellow&blue;,;09/15/17 , Essie Hansen;,;   $7.33   ;,;   yellow&blue&red
;,; 09/15/17   ,   Rene Hardy   ;,; $20.22   ;,;
black ;,;   09/15/17 ,   Lucy Snyder   ;,; $8.67
;,;black&red  ;,; 09/15/17 ,Dallas Obrien ;,;
$8.31;,;   black&red ;,;   09/15/17,   Stacey Payne
;,;   $15.70   ;,;   white&black&red ;,;09/15/17
,   Tanya Cox   ;,;   $6.74   ;,;yellow   ;,;
09/15/17 , Melody Moran ;,;   $30.84
;,;yellow&black;,;   09/15/17 , Louise Becker   ;,;
$12.31 ;,; green&yellow&black;,;   09/15/17 ,
Ryan Webster;,;$2.94 ;,; yellow ;,; 09/15/17
,Justin Blake ;,; $22.46   ;,;white&yellow ;,;
09/15/17,   Beverly Baldwin ;,;   $6.60;,;
white&yellow&black ;,;09/15/17   ,   Dale Brady
;,;   $6.27 ;,; yellow   ;,;09/15/17 ,Guadalupe Potter ;,;$21.12   ;,; yellow;,; 09/15/17   ,
Desiree Butler ;,;$2.10   ;,;white;,; 09/15/17
,Sonja Barnett ;,; $14.22 ;,;white&black;,;
09/15/17, Angelica Garza;,;$11.60;,;white&black
;,;   09/15/17   ,   Jamie Welch   ;,; $25.27   ;,;
white&black&red ;,;09/15/17   ,   Rex Hudson
;,;$8.26;,;   purple;,; 09/15/17 ,   Nadine Gibbs
;,;   $30.80 ;,;   purple&yellow   ;,; 09/15/17   ,
Hannah Pratt;,;   $22.61   ;,;   purple&yellow
;,;09/15/17,Gayle Richards;,;$22.19 ;,;
green&purple&yellow ;,;09/15/17   ,Stanley Holland
;,; $7.47   ;,; red ;,; 09/15/17 , Anna Dean;,;$5.49 ;,; yellow&red ;,;   09/15/17   ,
Terrance Saunders ;,;   $23.70  ;,;green&yellow&red
;,; 09/15/17 ,   Brandi Zimmerman ;,; $26.66 ;,;
red   ;,;09/15/17 ,Guadalupe Freeman ;,; $25.95;,;
green&red ;,;   09/15/17   ,Irving Patterson
;,;$19.55 ;,; green&white&red ;,;   09/15/17 ,Karl Ross;,;   $15.68;,;   white ;,;   09/15/17 , Brandy Cortez ;,;$23.57;,;   white&red   ;,;09/15/17,
Mamie Riley   ;,;$29.32;,; purple;,;09/15/17 ,Mike Thornton   ;,; $26.44 ;,;   purple   ;,; 09/15/17,
Jamie Vaughn   ;,; $17.24;,;green ;,; 09/15/17   ,
Noah Day ;,;   $8.49   ;,;green   ;,;09/15/17
,Josephine Keller ;,;$13.10 ;,;green;,;   09/15/17 ,   Tracey Wolfe;,;$20.39 ;,; red   ;,; 09/15/17 ,
Ignacio Parks;,;$14.70   ;,; white&red ;,;09/15/17
, Beatrice Newman ;,;$22.45   ;,;white&purple&red
;,;   09/15/17, Andre Norris   ;,;   $28.46   ;,;
red;,;   09/15/17 ,   Albert Lewis ;,; $23.89;,;
black&red;,; 09/15/17,   Javier Bailey   ;,;
$24.49   ;,; black&red ;,; 09/15/17   , Everett Lyons ;,;$1.81;,;   black&red ;,; 09/15/17 ,
Abraham Maxwell;,; $6.81   ;,;green;,;   09/15/17
,   Traci Craig ;,;$0.65;,; green&yellow;,;
09/15/17 , Jeffrey Jenkins   ;,;$26.45;,;
green&yellow&blue   ;,;   09/15/17,   Merle Wilson
;,;   $7.69 ;,; purple;,; 09/15/17,Janis Franklin
;,;$8.74   ;,; purple&black   ;,;09/15/17 ,
Leonard Guerrero ;,;   $1.86   ;,;yellow
;,;09/15/17,Lana Sanchez;,;$14.75   ;,; yellow;,;
09/15/17   ,Donna Ball ;,; $28.10  ;,;
yellow&blue;,;   09/15/17   , Terrell Barber   ;,;
$9.91   ;,; green ;,;09/15/17   ,Jody Flores;,;
$16.34 ;,; green ;,;   09/15/17,   Daryl Herrera
;,;$27.57;,; white;,;   09/15/17   , Miguel Mcguire;,;$5.25;,; white&blue   ;,;   09/15/17 ,
Rogelio Gonzalez;,; $9.51;,;   white&black&blue
;,;   09/15/17   ,   Lora Hammond ;,;$20.56 ;,;
green;,;   09/15/17,Owen Ward;,; $21.64   ;,;
green&yellow;,;09/15/17,Malcolm Morales ;,;
$24.99   ;,;   green&yellow&black;,; 09/15/17 ,
Eric Mcdaniel ;,;$29.70;,; green ;,; 09/15/17
,Madeline Estrada;,;   $15.52;,;green;,;   09/15/17
, Leticia Manning;,;$15.70 ;,; green&purple;,;
09/15/17 ,   Mario Wallace ;,; $12.36 ;,;green ;,;
09/15/17,Lewis Glover;,;   $13.66   ;,;
green&white;,;09/15/17,   Gail Phelps   ;,;$30.52
;,; green&white&blue   ;,; 09/15/17 , Myrtle Morris
;,;   $22.66   ;,; green&white&blue;,;09/15/17"""

#------------------------------------------------
# Start coding below!


daily_sales_replaced = daily_sales.replace(';,;','#')

daily_transactions = daily_sales_replaced.split(',')

#print(daily_transactions)

daily_transactions_split = []

for transaction in daily_transactions:
  daily_transactions_split.append(transaction.split('#'))

#print(daily_transactions_split)

clean_transactions = []
temp_transaction = [''] * 4

for transaction in daily_transactions_split:
  for item in range(4):
    temp_transaction[item] = transaction[item].strip()
  clean_transactions.append(temp_transaction)
  print(clean_transactions[-1])

print(clean_transactions)

问题根源

核心问题是列表引用复用:

  • temp_transaction = [''] * 4在循环外定义,意味着整个循环过程中始终使用同一个列表对象。
  • 每次循环只是修改这个列表的元素值,然后把该列表的引用添加到clean_transactions中。
  • 最终clean_transactions里的所有元素都指向同一个列表,最后一次循环修改的内容会覆盖之前所有记录。

解决方案

有两种简单的修复方式:

方式1:每次循环创建新的临时列表

把temp_transaction的定义放到循环内部,确保每次迭代都生成全新的列表:

clean_transactions = []

for transaction in daily_transactions_split:
  temp_transaction = [''] * 4  # 移到循环内,每次创建新列表
  for item in range(4):
    temp_transaction[item] = transaction[item].strip()
  clean_transactions.append(temp_transaction)
  print(clean_transactions[-1])

print(clean_transactions)

方式2:添加列表副本到结果中

如果要保留循环外的定义,可以在append时添加列表的副本(而非原列表的引用):

clean_transactions = []
temp_transaction = [''] * 4

for transaction in daily_transactions_split:
  for item in range(4):
    temp_transaction[item] = transaction[item].strip()
  clean_transactions.append(temp_transaction.copy())  # 添加副本
  print(clean_transactions[-1])

print(clean_transactions)

这两种方式都能确保clean_transactions中的每个元素都是独立的列表,不会被后续循环修改覆盖。

内容的提问来源于stack exchange,提问作者Some_Software_Dude

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 09:48:11