[英]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)
现在发生了什么是不知何故, mySliceRecord
在setRecord()
得到修改。 这是我的类SliceRecord()
的自定义对象,该类具有两个orderedDicts
。
print语句的输出是这样的:
在setRecord
: OrderedDict([('Name', 'asdklajsweq'), ('Age', 123), ('Email', 'asdasqweqwe')])
setRecord
后在setRecord
: OrderedDict([('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
读回并进行修改,那么您setRecord
在setRecord
看到修改。
简单的例子:
def foo(l):
l.append("foo")
x = []
foo(x)
print(x) # ['foo']
因此,我找到了解决方案,问题实际上出在SliceRecord类的实现中,在该实现中,我从未在init内初始化dict(),而是在类中直接对其进行初始化 ,因此,我有一个静态的类变量。 我知道我很蠢。 :-(
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.