【问题标题】:Can't figure out why appending to list isn't working无法弄清楚为什么附加到列表不起作用
【发布时间】:2018-05-16 02:09:47
【问题描述】:

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

【问题讨论】:

  • dataTemplate 永远不会改变,因此,您的循环在每次迭代时都会做同样的事情。
  • 你对同一个对象有多个引用。
  • @SPYBUG96 这有什么帮助?
  • 请提供minimal reproducible example。您当前的代码将不会运行,因为 dataTemplate 未定义。
  • 我猜你会使用idataTemplate 一起做一些不同的事情?

标签: python python-2.7


【解决方案1】:

问题是dataT = dataTemplate

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

dataTemplate 是一个吗?如果是这样,您可以通过将dataT = dataTemplate 更改为dataT = dataTemplate() 来修复您的程序。如果它不是一门课,你需要解释你想要做什么。

【讨论】:

    【解决方案2】:

    您每次都在列表中添加对 dataTemplate 的引用。如果您检查列表中的内存地址,您会发现它们指向相同的确切内存位置。

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

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

    【讨论】:

      【解决方案3】:

      正如其他人已经说过的,您在 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')
      

      【讨论】:

        猜你喜欢
        • 2021-05-29
        • 1970-01-01
        • 2014-12-08
        • 2012-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多