我有一个学校项目,我们正在制作基于自定义文本的数据库。
我有这个功能:
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
OrderedDict([('Name', ''), ('Age', '18'), ('Email', 'asdasd')])
self.readDB()
调用后显示的字典实际上是文本文件中的最后一条记录。
它可能与绑定有关,但我不明白的是mySliceRecord
变量名在其他任何地方都没有使用。任何帮助表示赞赏。 :)
更新:我的readDB()
方法也没有按预期工作,所有记录都显示相同的数据。
阅读文件后输出self.dbData
:
Record : OrderedDict([('Name', 'Hello'), ('Age', '20'), ('Email', 'Next')])
Record : OrderedDict([('Name', 'Hello'), ('Age', '20'), ('Email', 'Next')])
虽然在文件中我有两个不同的记录,但这里重复的记录是文件中的最后一条记录。我没有正确理解内存分配和复制。 : - |
PS:不要打扰我,我只是第二次在python上编码。答案 0 :(得分:0)
您正在改变mySliceRecord
中readDB()
的状态。 Python对象是引用,这意味着可以修改传递给其他函数的可变对象,即使没有设置变量本身。如果您将mySliceRecord
添加到self.dbData
,请从self.dbData
中的readDB()
开始阅读,并对其进行修改,您也会在setRecord
中看到修改。
简单示例:
def foo(l):
l.append("foo")
x = []
foo(x)
print(x) # ['foo']
答案 1 :(得分:0)
所以我找到了解决方案,问题实际上是在SliceRecord类实现中,我从未在 init 中初始化dict()但是直接在类中,因此我有一种静态类变量。我知道傻了。 : - (