Python修改函数中的局部变量

2024-05-07 16:01:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个学校的项目中,我们正在制定自定义文本为基础的数据库。你知道吗

我有这个功能:

def setRecord(self,mySliceRecord):
    print("In setRecord :",mySliceRecord.record)
    self.readDB()
    print("In setRecord after reading:",mySliceRecord.record)

    if self.dbSchema.dbIndex:
        self.dbData[mySliceRecord.record[self.dbSchema.dbIndex]] = mySliceRecord
    else:
        self.dbData.append(mySliceRecord)
    return True

由此调用readDB(),即:

def readDB(self):
    dictCounter = 0
    if self.dbSchema.dbIndex:
        self.dbData = dict()
    else:
        self.dbData = list()
    file = open(self.dbName+'.apd')
    for line in file:
        counter = 0
        splittedLine = line.split("|")
        sliceRecord = SliceRecord(self.dbSchema.schema)

        for item in splittedLine:
            if item:
                sliceRecord.record[self.dbSchema.schemaList[counter]] = item.strip()
            counter += 1
        if self.dbSchema.dbIndex:
            self.dbData[sliceRecord.record[self.dbSchema.dbIndex]] = sliceRecord
        else:
            self.dbData.append(sliceRecord)

现在发生的事情不知何故,mySliceRecordsetRecord()被修改。这是我的类SliceRecord()的一个自定义对象,它有两个orderedDicts。你知道吗

print语句的输出如下:

setRecordOrderedDict([('Name', 'asdklajsweq'), ('Age', 123), ('Email', 'asdasqweqwe')])

setRecord阅读后:OrderedDict([('Name', ''), ('Age', '18'), ('Email', 'asdasd')])

self.readDB()调用之后显示的dict实际上是文本文件中的最后一条记录。你知道吗

它可能与绑定有关,但我不明白的是mySliceRecord变量名在其他地方没有使用。感谢您的帮助。:)

更新:我的readDB()方法也没有按预期工作,所有记录都显示相同的数据。你知道吗

读取文件后self.dbData的输出:

Record : OrderedDict([('Name', 'Hello'), ('Age', '20'), ('Email', 'Next')]) Record : OrderedDict([('Name', 'Hello'), ('Age', '20'), ('Email', 'Next')])

在文件中我有两个不同的记录,这里重复的记录是文件中的最后一个记录。我没有正确理解内存分配和复制。:—|

PS:别揍我,我只是第二次用python编写代码。你知道吗


Tags: nameselfageifemail记录recordordereddict
2条回答

你在改变readDB()mySliceRecord的状态。Python对象是引用,这意味着传递给其他函数的可变对象可以被修改,即使变量本身没有被设置。如果您将mySliceRecord添加到self.dbData,从readDB()中的self.dbData读回它,并对其进行修改,您将看到setRecord中的修改。你知道吗

简单示例:

def foo(l):
    l.append("foo")

x = []
foo(x)
print(x)  # ['foo']

所以我找到了解决方案,问题实际上是在SliceRecord类实现中,我从来没有在init中初始化dict(),而是直接在类中初始化,因此我有一种静态类变量。我知道我很蠢。:-(

相关问题 更多 >