无法弄清楚为什么追加到列表不起作用

时间:2018-05-16 02:09:48

标签: python python-2.7

我循环遍历列表以生成一些json。但是当我追加到listToSave时我有一个错误。

listToSave = []

for i in range(len(ffts)):

    dataT = dataTemplate

    dataT['aClip']['info']['id'] = str(uuid.uuid4())   
    #More stuff added here        

    print dataT['aClip']['info']['id']

    listToSave.append(dataT)

print 'Data formated - Ready to save'

输出:

493838a3-de8e-4bc4-86a4-92999bd625bd
c7c6f984-85b5-478b-9395-48ebd8611ab8
d427dd05-063c-49de-bbff-70b09c56f1fa
98dc6ef5-182d-4963-bc0d-7537bd3ca9e2
74587d54-811c-485e-bbed-1428723a6da1
5052f46e-371d-4bec-b750-e231abd3448d
Data formated - Ready to save

但是,当我查看listToSave列表时,我只看到重复生成的最后一个值。

print len(toSave)

print toSave[0]['aClip']['info']['id']
print toSave[1]['aClip']['info']['id']
print toSave[2]['aClip']['info']['id']
print toSave[3]['aClip']['info']['id']
print toSave[4]['aClip']['info']['id']
print toSave[5]['aClip']['info']['id']

输出:

6
5052f46e-371d-4bec-b750-e231abd3448d
5052f46e-371d-4bec-b750-e231abd3448d
5052f46e-371d-4bec-b750-e231abd3448d
5052f46e-371d-4bec-b750-e231abd3448d
5052f46e-371d-4bec-b750-e231abd3448d
5052f46e-371d-4bec-b750-e231abd3448d

帮助?

dataTemplate获取完整示例。虽然,我相信我没有这个尝试它,它仍然运行。

dataTemplate = {
  "aClip": {
    "info" : {
      "id" : None,
      "type" : None,
      "author" : None,
      "timeStamp" : None,
      "output" : None,
    },
    "t": {
      "tData": None,
      "tFs" : None,
      "tLen" : None,
    },
    "f" : {
      "fData" : None,
      "fFreq" : None,
      "fLen" : None,
    }
  }
}

3 个答案:

答案 0 :(得分:1)

问题是dataT = dataTemplate

您可能认为在循环的每次迭代中都在创建并分配 new dataTemplate对象。但事实上,整个计划中只有一个。因此,dataT['aClip']['info']['id'] = str(uuid.uuid4())每次都会覆盖相同的字符串,并且您已经添加了对相同 dataTemplate的多个引用。

dataTemplate吗?如果是,您可以通过将dataT = dataTemplate更改为dataT = dataTemplate()来修复您的计划。如果它不是课程,您需要解释您尝试做的事情。

答案 1 :(得分:1)

您每次都会向您的列表中附加一个引用到dataTemplate。如果检查列表中的内存地址,您会发现它们指向相同的内存位置。

因此,您只有最后一个值。

我不确定你的dataTemplate是什么。如果它是一个课程,您每次都需要创建一个新课程。如果它是python字典或一些JSON,也是一样。

答案 2 :(得分:0)

正如其他人已经说过的那样,你在for循环的每次迭代中传递相同的元素。虽然我不知道dataTemplate的样子,但假设defaultdictuuid不同,您似乎可以使用i

from collections import defaultdict

dataT = defaultdict(str)

for i in range(len(ffts)):

    dataT[str(uuid.uuid4())] = 'somedata'
    #More stuff added here        

print('Data formated - Ready to save')