Python列表项被最后附加的项覆盖
我有这个密码:Python列表项被最后附加的项覆盖,python,list,append,Python,List,Append,我有这个密码: def __parse(self): for line in self.lines: r = Record(line) self.records[len(self.records):] = [r] print self.records[len(self.records)-1].getValue() # Works fine! print self.record[0].getValue() # Give
def __parse(self):
for line in self.lines:
r = Record(line)
self.records[len(self.records):] = [r]
print self.records[len(self.records)-1].getValue() # Works fine!
print self.record[0].getValue() # Gives the same as
print self.record[1].getValue() # as
# ... and so on ...
print self.record[len(self.record)-1].getValue()
现在它应该做的是用一行行的文本做记录。但是,当我在for循环完成后访问这些列表时,所有记录对我调用的方法给出相同的结果。当我在for循环中访问一条记录时,在它被附加之后,它就是正确的记录,因此记录init不能是错误的。不,绝对肯定我放的那几行是不同的!有人知道为什么会这样吗?非常感谢您的帮助 您没有附加到
self.records
;你总是在覆盖它
使用:
self.records.append(r)
相反
编辑:没关系。参见伊格纳西奥·瓦斯奎兹·艾布拉姆斯的评论。如果不是因为这个原因,我会删除这个答案。您没有附加到
self.records
;你总是在覆盖它
使用:
self.records.append(r)
相反
编辑:没关系。参见伊格纳西奥·瓦斯奎兹·艾布拉姆斯的评论。如果不是因为这个原因,我会删除这个答案。如果用以下内容替换它,还会发生这种情况吗:
self.record = [Record(l) for l in self.lines]
class Record:
def __init__(self,lines):
self.record = {}
self.__parse()
class CsvSet:
def __init__(self,lines):
self.records = []
self.__parse()
编辑:
记录
中一定有错误,因为那里的代码确实有效,即使它让有经验的编码人员在阅读时流泪。如果用以下代码替换它,还会发生这种情况吗:
self.record = [Record(l) for l in self.lines]
class Record:
def __init__(self,lines):
self.record = {}
self.__parse()
class CsvSet:
def __init__(self,lines):
self.records = []
self.__parse()
编辑:
Record
中一定有错误,因为那里的代码确实有效,即使有经验的程序员在阅读时会流泪。Record类已损坏,您总是返回相同的对象
如果没有看到记录的代码,就无法猜测
也许您正在使用列表或dict作为\uuuu init\uuuu
的默认参数,并使用getValue()
返回该参数
另一种可能是
getValue()
返回的是类属性而不是实例属性如果记录类已损坏,则始终返回相同的对象
如果没有看到记录的代码,就无法猜测
也许您正在使用列表或dict作为\uuuu init\uuuu
的默认参数,并使用getValue()
返回该参数
另一种可能是
getValue()
返回的是类属性而不是实例属性确定,因此我也将发布记录类的代码以进行说明
课堂记录:
record = {}
line = ""
def __init__(self,line):
self.line = line
self.__parse()
def __parse(self):
fieldnames = ['from','to','value','error']
fields = self.line.split(',')
c = 0
for field in fields:
self.record[fieldnames[c]] = field.strip()
c+=1
self.record['from'] = datetime.datetime.strptime(self.record['from'],"%Y-%m-%d")
self.record['to'] = datetime.datetime.strptime(self.record['to'],"%Y-%m-%d")
类别CsvSet:
records = []
def __init__(self,lines):
self.__parse()
def __parse(self):
for line in self.lines:
self.records.append(Record(line))
CsvSet中的_parse方法现在是它最初的样子。由于调试原因,我更改了if,但结果是一样的。Ignacio你是对的,我两周前才开始使用Python…好的,所以我也将发布Record类的代码以供澄清 课堂记录:
record = {}
line = ""
def __init__(self,line):
self.line = line
self.__parse()
def __parse(self):
fieldnames = ['from','to','value','error']
fields = self.line.split(',')
c = 0
for field in fields:
self.record[fieldnames[c]] = field.strip()
c+=1
self.record['from'] = datetime.datetime.strptime(self.record['from'],"%Y-%m-%d")
self.record['to'] = datetime.datetime.strptime(self.record['to'],"%Y-%m-%d")
类别CsvSet:
records = []
def __init__(self,lines):
self.__parse()
def __parse(self):
for line in self.lines:
self.records.append(Record(line))
CsvSet中的_parse方法现在是它最初的样子。由于调试原因,我更改了if,但结果是一样的。Ignacio你说得对,我两周前才开始使用Python…Ahue,在共享类名称空间中有可变对象——这是开始使用Python时常见的误解。将
CsvSet
中的records=[]
的初始化移动到其\uuuuuu init\uuuu
函数中,并将record={}
移动到record
\uuuu init\uuuu
函数中。应如下所示:
self.record = [Record(l) for l in self.lines]
class Record:
def __init__(self,lines):
self.record = {}
self.__parse()
class CsvSet:
def __init__(self,lines):
self.records = []
self.__parse()
在类区域中声明可变变量时,它将在这些类的所有实例之间共享,而不是为每个实例创建。通过将初始化移动到实例方法中(
\uuuu init\uuu
),您正在为每个实例创建新的可变存储,这正是您想要的。Ahue,您在共享类命名空间中有可变对象——这是在开始使用python时常见的误解。将CsvSet
中的records=[]
的初始化移动到其\uuuuuu init\uuuu
函数中,并将record={}
移动到record
\uuuu init\uuuu
函数中。应如下所示:
self.record = [Record(l) for l in self.lines]
class Record:
def __init__(self,lines):
self.record = {}
self.__parse()
class CsvSet:
def __init__(self,lines):
self.records = []
self.__parse()
在类区域中声明可变变量时,它将在这些类的所有实例之间共享,而不是为每个实例创建。通过将初始化移动到实例方法中(
\uuuu init\uuu
),可以为每个实例创建新的可变存储,这正是您想要的。记录类被破坏。使用类变量(Record.Record)而不是实例属性。类变量对于所有实例都是一个变量,您希望每个实例都有不同的self.record
移动:
record = {}
line = ""
进入构造函数的行(缩进到
def\uuuu init\uuuu(self,行):
)记录类被破坏。使用类变量(Record.Record)而不是实例属性。类变量对于所有实例都是一个变量,您希望每个实例都有不同的self.record
移动:
record = {}
line = ""
进入构造函数的行(缩进在
def\uuu init\uuuu(self,行):
)为什么不直接执行self.records.append(r)?您能告诉我们如何定义Record
?如果Record
将line
存储为类属性而不是实例属性,则这可能解释了问题。您只检查循环中的最新记录。以前的值呢?为什么不做self.records.append(r)?您能告诉我们如何定义Record
?如果Record
将line
存储为类属性而不是实例属性,则这可能解释了问题。您只检查循环中的最新记录。以前的值呢?实际上,L[len(L):]=[X]
是一种病态的append形式。这是一种相当不错的混淆。实际上,L[len(L):]=[X]
是一种病态的append形式。这是一种相当不错的混淆。我还认为是Record()类