Python列表执行append操作时所有元素被新添加项覆盖问题求助
问题产生原因
- 核心错误是没有正确实例化自定义的
File类:你在NewFile、NewDir函数中写的Newfile = File是直接将File类本身赋值给变量,而非创建类的实例。你往FilesList列表中添加的所有元素都是同一个File类的引用,每次修改Metadata都是修改类的公共属性,自然会表现为所有元素被新值覆盖。 - 次要问题是
File类的属性和方法定义错误:当前Data、Metadata都是类属性,所有实例共享;Read、Write等方法没有加self参数,无法绑定实例属性,后续调用会报错。
修复方案
- 重写
File类,增加初始化方法,将属性改为实例专属,方法补全self参数:
class File: def __init__(self): # 每个实例独立持有属性,不会共享 self.Data = "" self.Metadata = Meta(0, None, None, None) def Read(self): return self.Data def Write(self, NewData): self.Data = str(NewData) def Append(self, AppendData): self.Data = self.Data + str(AppendData)
- 修改
NewFile、NewDir函数中的实例化代码,加括号创建独立的实例对象:
def NewFile(Name, extention): # 加括号实例化,创建新的File对象 Newfile = File() Newfile.Metadata = Meta(0, "File", CurrentDir + str(Name), str(extention)) print(Newfile.Metadata.name) FilesList.append(Newfile) for i in range(len(FilesList)): print( str(i) + ", " + FilesList[i].Metadata.name) def NewDir(Name): # 加括号实例化 Newdir = File() Newdir.Metadata = Meta(0, "Directory", CurrentDir + str(Name), None) FilesList.append(Newdir)
- 可选修复:
Actualize函数中你赋值的CurrentDir是局部变量,不会修改全局的CurrentDir,如果需要修改全局值可以在函数开头加global CurrentDir声明。
修复后运行代码,输出会依次显示Hello1到Hello5,不会出现所有元素被覆盖的问题。
内容的提问来源于stack exchange,提问作者Leviathan Corporation FR
相关产品推荐
相关产品推荐

