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
相关产品推荐
相关产品推荐

