附加在列表中导致值覆盖

时间:2012-08-27 16:09:39

标签: python

我面临着一个特殊的问题。我将简要介绍一下 假设我有这段代码 -

class MyClass:

   __postBodies = []
    .
    .
    .
for the_file in os.listdir("/dir/path/to/file"):
      file_path = os.path.join(folder, the_file)
      params = self.__parseFileAsText(str(file_path)) #reads the file and gets some parsed data back
      dictData = {'file':str(file_path), 'body':params}
      self.__postBodies.append(dictData)
      print self.__postBodies
      dictData = None
      params = None

问题是,当我每次为不同的文件打印params和dictData时它有不同的值(正确的东西),但是一旦附加发生,我打印__postBodies就会发生一件奇怪的事情。如果有你的文件,假设A,B,C,那么

  

第一次__postBodies的内容= [{'body':{有一些dict   与文件A},'file'相关的数据:'path / of / A'}]

     

第二次成为= [{'body':{一个dict,其中一些数据重新连接到   文件B},'文件':'path / of / A'},{'body':{一个dict,其中一些数据已关联到   文件B},'文件':'路径/ / B'}]

     

AND第三次= [{'body':{一个数据与一些数据相关联到文件C},   'file':'path / of / A'},{'body':{一个dict,其中一些数据已关联到文件C},   'file':'path / of / B'},{'body':{一个dict,其中一些数据已关联到文件C},   '文件': '路径/ / C的'}]

所以,你看到'文件'键工作得非常好。奇怪的是,'body'键被覆盖了最后一个附加的所有条目。

我犯了什么错吗?有什么我必须的吗?请指点我的方向。

很抱歉,如果我不是很清楚。

编辑------------------------

从self .__ parseFileAsText(str(file_path))调用返回是一个dict,我在dictData中作为'body'插入。

EDIT2 ----------------------------

正如你所问,这是代码,但我检查了params = self .__ parseFileAsText(str(file_path))调用每次都返回一个diff dict。

def __parseFileAsText(self, fileName):

        i = 0
        tempParam = StaticConfig.PASTE_PARAMS

        tempParam[StaticConfig.KEY_PASTE_PARAM_NAME] = ""
        tempParam[StaticConfig.KEY_PASTE_PARAM_PASTEFORMAT] = "text"
        tempParam[StaticConfig.KEY_PASTE_PARAM_EXPIREDATE] = "N"
        tempParam[StaticConfig.KEY_PASTE_PARAM_PRIVATE] = ""
        tempParam[StaticConfig.KEY_PASTE_PARAM_USER] = ""
        tempParam[StaticConfig.KEY_PASTE_PARAM_DEVKEY] = ""
        tempParam[StaticConfig.KEY_PASTE_FORMAT_PASTECODE] = ""

        for line in fileinput.input([fileName]):
            temp = str(line)
            temp2 = temp.strip()
            if i == 0:              
                postValues = temp2.split("|||")

                if int(postValues[(len(postValues) - 1)]) == 0 or int(postValues[(len(postValues) - 1)]) == 2:
                    tempParam[StaticConfig.KEY_PASTE_PARAM_NAME] = str(postValues[0])

                    if str(postValues[1]) == '':                                        
                        tempParam[StaticConfig.KEY_PASTE_PARAM_PASTEFORMAT] = 'text'
                    else:
                        tempParam[StaticConfig.KEY_PASTE_PARAM_PASTEFORMAT] = postValues[1]

                    if str(postValues[2]) != "N":
                        tempParam[StaticConfig.KEY_PASTE_PARAM_EXPIREDATE] = str(postValues[2])

                    tempParam[StaticConfig.KEY_PASTE_PARAM_PRIVATE] = str(postValues[3])
                    tempParam[StaticConfig.KEY_PASTE_PARAM_USER] = StaticConfig.API_USER_KEY
                    tempParam[StaticConfig.KEY_PASTE_PARAM_DEVKEY] = StaticConfig.API_KEY

                else:
                    tempParam[StaticConfig.KEY_PASTE_PARAM_USER] = StaticConfig.API_USER_KEY
                    tempParam[StaticConfig.KEY_PASTE_PARAM_DEVKEY] = StaticConfig.API_KEY
                i = i+1
            else:
                if tempParam[StaticConfig.KEY_PASTE_FORMAT_PASTECODE] != "" :           
                    tempParam[StaticConfig.KEY_PASTE_FORMAT_PASTECODE] = str(tempParam[StaticConfig.KEY_PASTE_FORMAT_PASTECODE])+"\n"+temp2
                else:
                    tempParam[StaticConfig.KEY_PASTE_FORMAT_PASTECODE] = temp2

        return tempParam

2 个答案:

答案 0 :(得分:2)

每次调用MyClass.__parseFileAsText()时,您可能会返回相同的字典,这可能是一种常见的方式:

  • __parseFileAsText()接受mutable default argument(您最终返回的字典)
  • 您修改类或实例的属性并返回该属性,而不是每次都创建一个新属性

确保在每次调用__parseFileAsText()时创建新词典都应解决此问题。

修改:根据您使用__parseFileAsText()代码更新的问题,您的问题是您在每次通话时都重复使用相同的词典:

tempParam = StaticConfig.PASTE_PARAMS
...
return tempParam

在每次调用时,您正在修改StaticConfig.PASTE_PARAMS,最终结果是列表中的所有正文字典实际上都是对StaticConfig.PASTE_PARAMS的引用。根据{{​​1}}的内容,您应该将该顶行更改为以下之一:

StaticConfig.PASTE_PARAMS

如果# StaticConfig.PASTE_PARAMS is an empty dict tempParam = {} # All values in StaticConfig.PASTE_PARAMS are immutable tempParam = dict(StaticConfig.PASTE_PARAMS) 中的任何值都是可变的,您可以使用copy.deepcopy,但最好使用这些默认值填充StaticConfig.PASTE_PARAMS

答案 1 :(得分:0)

如果__postBodies不是类属性,如现在定义的那样,但只是一个实例属性,该怎么办?