簡體   English   中英

無法弄清楚為什么追加到列表不起作用

[英]Can't figure out why appending to list isn't working

我正在遍歷列表以生成一些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,
    }
  }
}

問題是dataT = dataTemplate

您可能認為您正在循環的每次迭代中創建並分配一個新的 dataTemplate對象。 但是,實際上,整個程序中只有一個。 因此, dataT['aClip']['info']['id'] = str(uuid.uuid4())每次都覆蓋相同的字符串,並且您已將多個引用添加到同一 dataTemplate。

dataTemplate是一個嗎? 如果是這樣,您可以通過將dataT = dataTemplate更改為dataT = dataTemplate()來修復程序。 如果不是課程,則需要解釋您要做什么。

您每次都將對dataTemplate的引用附加到列表中。 如果檢查列表中的內存地址,您會發現它們指向相同的確切內存位置。

因此,您將只有最后一個值。

我不確定您的dataTemplate是什么。 如果是一堂課,您需要每次創建一個新的課。 如果是python字典或某些JSON,也是如此。

正如其他人已經說過的,您在for循環的每次迭代中都傳遞相同的元素。 盡管我不知道dataTemplate是什么樣的,但假設uuidi不同,似乎可以使用defaultdict

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')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM