Python读取文本文件转整数存入列表异常求助:结果重复
问题分析与解决方法
嘿,我来帮你搞定这个问题~你遇到的这个情况其实是Python里对象引用的常见坑:
你在函数开头只创建了一个列表m = [0,0],之后每次循环只是修改这个列表里的元素值,然后把m添加到lis中。但实际上,lis.append(m)存的不是列表里的值,而是m这个列表对象的引用。所以lis里的三个元素其实都指向同一个列表对象,当最后一次循环把m改成[5,6]时,所有引用都会显示这个最终值,这就是为什么你得到[[5,6], [5,6], [5,6]]。
解决方法有两种,选你顺手的就行:
方法1:每次循环新建一个列表对象
把m = [0,0]放到循环内部,这样每次循环都会创建一个全新的列表,就不会出现引用复用的问题了:
def read_file(): lis = [] with open("data.txt") as f: for line in f: m = [0,0] # 每次循环都新建列表 m[0], m[1] = line.split(",") m[0] = int(m[0]) m[1] = int(m[1].strip()) # 处理可能存在的换行符 lis.append(m) print(lis)
方法2:添加列表的副本而非原引用
如果不想移动m的定义,可以在append的时候创建m的副本,这样存的就是当前值的拷贝,不会跟着后续修改变化:
def read_file(): lis = [] m = [0,0] with open("data.txt") as f: for line in f: m[0], m[1] = line.split(",") m[0] = int(m[0]) m[1] = int(m[1].strip()) lis.append(m.copy()) # 添加副本,避免引用复用 # 也可以用 lis.append(list(m)) 效果一致 print(lis)
额外优化:简化代码
其实你可以跳过初始化m的步骤,直接拆分字符串并转换为整数,一步生成子列表:
def read_file(): lis = [] with open("data.txt") as f: for line in f: # 拆分后直接转整数,生成新列表 num1, num2 = map(int, line.strip().split(",")) lis.append([num1, num2]) print(lis)
这样运行后就能得到你预期的[[1, 2], [3, 4], [5, 6]]啦~
内容的提问来源于stack exchange,提问作者Huyen
相关产品推荐
相关产品推荐

