繁体   English   中英

Python修改函数中的局部变量

[英]Python modifying the local variable in function

我有一个学校项目,正在制作基于自定义文本的数据库。

我有这个功能:

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后在setRecordOrderedDict([('Name', ''), ('Age', '18'), ('Email', 'asdasd')])

self.readDB()调用后显示的字典实际上是文本文件中的最后一条记录。

它可能与绑定有关,但是我不明白的是mySliceRecord变量名没有在其他地方使用。 任何帮助表示赞赏。 :)

更新:我的readDB()方法也无法正常工作,所有记录都显示相同的数据。

读取File后输出self.dbData

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

尽管在文件中我有两个不同的记录,但此处重复的记录是文件中的最后一条记录。 我无法正确理解内存分配和复制。 : - |

PS:不要打扰我,我只是第二次在python上编码。

您正在变异mySliceRecord readDB()mySliceRecord的状态。 Python对象是引用,这意味着即使未设置变量本身 ,也可以修改传递给其他函数的可变对象。 如果将mySliceRecord添加到self.dbData ,从self.dbData readDB() self.dbData读回并进行修改,那么您setRecordsetRecord看到修改。

简单的例子:

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

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

因此,我找到了解决方案,问题实际上出在SliceRecord类的实现中,在该实现中,我从未在init内初始化dict(),而是在类中直接对其进行初始化 ,因此,我有一个静态的类变量。 我知道我很蠢。 :-(

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM