Python在函数中修改局部变量

时间:2014-08-23 01:48:38

标签: python variables binding

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

我有这个功能:

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语句的输出是:

setRecordOrderedDict([('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上编码。

2 个答案:

答案 0 :(得分:0)

您正在改变mySliceRecordreadDB()的状态。 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()但是直接在类中,因此我有一种静态类变量。我知道傻了。 : - (