【问题标题】:Why do these .append() statements overwrite each other?为什么这些 .append() 语句会相互覆盖?
【发布时间】:2017-08-02 21:48:37
【问题描述】:

我有一个功能如下:

def control(qstat):
    gatnum = int(input("What number of control gates is this control qubit a part of?"))
    global qstatnum
    qstatnum = {}
    qstatnum[gatnum] = []
    qstatnum[gatnum].append(qstat) #seems to be a problem
    return qstat

但是,有一个问题。假设我运行一次。列表中将有一项。然后,我第二次运行它,将一个与第二个不同的项目添加到列表中。当我打印qstatnum[gatnum] 时,该列表仅包含第二项,这使我相信.append() 语句在某种程度上被错误地写入并覆盖了之前添加到列表中的任何内容。

这是一个正确的诊断吗?为什么会这样?任何帮助,将不胜感激。谢谢!

【问题讨论】:

  • qstatnum = {} 这应该在函数之外
  • 还有qstatnum[gatnum] = [] 是有问题的。我本来希望看到qstatnum.setdefault(gatnum, []).append(qstat)
  • @DanD.,出于好奇,为什么这样更好,它到底有什么作用?我以前从未见过.setdefault
  • 它说如果你有一个列表,然后得到它。否则,做一个空的

标签: python list python-3.x dictionary append


【解决方案1】:

每次调用函数,都是在创建一个新的qstatnumdict,所以解决方法是在函数外创建字典:

qstatnum = {}

def control(qstat):
    gatnum = int(input("What number of control gates is this control qubit a part of?"))
    try:
        qstatnum[qstat].append(gatnum)
    except:
        qstatnum[qstat] = [gatnum]
    return qstat

您需要一个try: except: 块来验证字典中是否已经存在该键,如果不存在,只需添加第一个值,否则使用附加。

@DanD。方法似乎更短,请看一下:

qstatnum = {}

def control(qstat):
    gatnum = int(input("What number of control gates is this control qubit a part of?"))

    qstatnum.setdefault(qstat, []).append(gatnum)

    return qstat

【讨论】:

  • 啊,我需要保留global qstatnum 行 - 让我试试。
  • 好的,我试过了,它仍然给出完全相同的错误。
  • 你还在重置qstatnum[gatnum] = []
  • @cricket_007,好的 - 我如何设置它但不每次都重置?
  • 您能否提供一个 qstatnum 预期内容的示例?
【解决方案2】:

每次调用该方法时,qstatnum 都会设置为空。所以基本上你每次都没有附加任何内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 2017-07-01
    • 2013-07-02
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    • 2021-03-11
    相关资源
    最近更新 更多