如何为列表中每个Periodic对象的number属性加1修正原子序数?
修复Periodic对象列表的原子序数赋值问题
问题分析
你当前的代码存在几个关键错误,导致所有Periodic对象的number属性都为1,且后续的循环根本没修改对象属性:
- 变量名拼写错误:
atom_fil、atom_lista这类错误命名会导致程序运行报错或无法正确构建列表。 - 读取文件时
number未递增:初始赋值number=1后,循环读取每行时没有更新number,所以所有对象的初始number都是1。 - 无效的循环操作:你写的
for i in atom_list: number +=1只是累加number变量,完全没修改每个对象的i.number属性,对结果无影响。 - 函数调用缺失括号:
create_atom_list不会执行函数,必须加括号create_atom_list()。 - 文件处理不规范:手动调用
close()容易遗漏,建议用with语句自动管理文件资源。
修复后的完整代码
class Periodic: def __init__(self, number, weight, atom): self.number = number self.atom = atom self.weight = weight def __str__(self): return self.atom + " " + str(self.weight) def __repr__(self): return str(self.number) + " " + self.atom + " " + str(self.weight) def create_atom_list(): # 用with语句自动关闭文件,避免资源泄漏 with open('atomer2.txt', 'r') as atom_file: atom_list = [] # 先读取所有元素,暂不设置正确number(排序后顺序会变化) for line in atom_file: line = line.strip() # 跳过空行,防止split()报错 if not line: continue atom, weight_str = line.split() weight = float(weight_str) # 初始number设为0,后续排序后重新赋值 new_atom = Periodic(0, weight, atom) atom_list.append(new_atom) # 按原子量排序 atom_list.sort(key=lambda x: x.weight) # 遍历排序后的列表,为每个对象设置从1开始的原子序数 for idx, atom_obj in enumerate(atom_list, start=1): atom_obj.number = idx print(atom_list) return atom_list # 调用函数必须加括号 create_atom_list()
关键修改说明
- 修正变量名:统一使用
atom_file和atom_list,确保代码逻辑连贯。 - 先读取后排序再赋值:因为原子序数是按原子量排序后的顺序,所以先读取所有元素,排序后再通过
enumerate获取从1开始的索引,直接赋值给每个对象的number属性,这才是真正修改对象的属性值。 - 文件安全处理:
with语句会在代码块结束后自动关闭文件,无需手动调用close()。 - 空行处理:增加
line.strip()和空行判断,避免文件中存在空行时导致的split()错误。 - 修正函数调用:添加括号确保函数执行。
内容的提问来源于stack exchange,提问作者tryhhaaards
相关产品推荐
相关产品推荐

