Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python列表项被最后附加的项覆盖_Python_List_Append - Fatal编程技术网

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()类