gpt4 book ai didi

python - 追加到列表中导致值覆盖

转载 作者:行者123 更新时间:2023-12-01 05:56:48 26 4
gpt4 key购买 nike

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

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,那么

first time __postBodies has the content = [{'body':{A dict with some data related to file A}, 'file':'path/of/A'}]

second time it becomes = [{'body':{A dict with some data relaed to file B}, 'file':'path/of/A'}, {'body':{A dict with some data relaed to file B}, 'file':'path/of/B'}]

AND third time = [{'body':{A dict with some data relaed to file C}, 'file':'path/of/A'}, {'body':{A dict with some data relaed to file C}, 'file':'path/of/B'}, {'body':{A dict with some data relaed to file C}, 'file':'path/of/C'}]

所以,您会看到"file"键工作得很好。奇怪的是,所有条目的“body”键都被覆盖,最后附加了一个条目。

我有什么错误吗?有什么事我必须做吗?请给我指一个方向。

抱歉,如果我不太清楚。

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

self.__parseFileAsText(str(file_path)) 调用的返回是一个字典,我将其作为“body”插入到 dictData 中。

编辑2----------------------------

正如您所问,这是代码,但我已经检查过 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

最佳答案

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

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

确保每次调用 __parseFileAsText() 时都创建一个新字典应该可以解决此问题。

编辑:根据您使用 __parseFileAsText() 代码更新的问题,您的问题是您在每次调用中重复使用相同的字典:

tempParam = StaticConfig.PASTE_PARAMS
...
return tempParam

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

# StaticConfig.PASTE_PARAMS is an empty dict
tempParam = {}

# All values in StaticConfig.PASTE_PARAMS are immutable
tempParam = dict(StaticConfig.PASTE_PARAMS)

如果 StaticConfig.PASTE_PARAMS 中的任何值是可变的,您可以使用 copy.deepcopy但最好自行使用这些默认值填充 tempParam

关于python - 追加到列表中导致值覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12145558/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com