Не могу понять, почему добавление в список не работает - PullRequest
0 голосов
/ 16 мая 2018

Я перебираю список, чтобы сгенерировать 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 голосов
/ 16 мая 2018

Вы добавляете в свой список ссылку на dataTemplate каждый раз.Если вы проверите адреса памяти в вашем списке, вы обнаружите, что они указывают на одно и то же точное место в памяти.

Следовательно, у вас будет только последнее значение.

Я не уверен, что ваше dataTemplate является.Если это класс, вам нужно каждый раз создавать новый.То же самое, если это был словарь Python или какой-то JSON.

0 голосов
/ 16 мая 2018

Как уже говорили другие, вы передаете один и тот же элемент на каждой итерации цикла for.Хотя я не знаю, как выглядит dataTemplate, похоже, что вы можете использовать defaultdict, предполагая, что uuid зависит от 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')
0 голосов
/ 16 мая 2018

Проблема в dataT = dataTemplate.

Возможно, вы полагаете, что создаете и присваиваете новый объект dataTemplate в каждой итерации цикла.Но на самом деле во всей программе есть только один.Поэтому dataT['aClip']['info']['id'] = str(uuid.uuid4()) перезаписывает одну и ту же строку каждый раз, и вы добавили несколько ссылок на один и тот же dataTemplate.

Является ли dataTemplate классом ?Если это так, вы можете исправить вашу программу, изменив dataT = dataTemplate на dataT = dataTemplate().Если это не класс, вам нужно объяснить, что вы пытаетесь сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...