<p>出现此错误是因为<code>db</code>中没有元素(python列表被初始化为长度为0),因此当您尝试替换位于<code>self.seqNum</code>的元素时,您正在访问一个无效的索引。这与它的全球性无关。在</p>
<p>如果我们假设只能以线程安全的方式访问这个全局列表,那么您应该能够:</p>
<pre><code>db.appened(self)
</code></pre>
<p>相反。然而,正如注释中提到的,如果这个类是与db列表接口的“看门人”,那么在这个用例中,使<code>db</code>成为一个类变量更有意义。在</p>
<p><strong>更新</strong></p>
<p>为了在评论中回答OP的问题</p>
<blockquote>
<p>I am looking to be able to keep track of the location of the objects in the list by the seqNum</p>
</blockquote>
<p>如前所述,<code>seqNum</code>将永远线性递增,与每个新的<code>NoteSet</code>实例一起。如果我们假设<code>Note.nextseqNum</code>的线程安全访问,那么通过<code>db[self.seqNum]</code>所做的事情已经通过<code>db.append(self)</code>隐式地完成了,因为<code>len(db) == Note.nextseqNum</code>总是这样。现在,我们将忽略如果您可以从<code>db</code>中删除</em></strong>元素会发生什么,因为现在您的系统根本不考虑这个问题,无论如何都会完全崩溃。在</p>
<p>但是,如果将来<code>seqNum</code>不是每次生成一个新实例时都单调地增加,那么您可以简单地使<code>db</code>变成<code>dict</code>,而不是<code>list</code>:</p>
^{pr2}$
<p>然后将新实例完全插入到它中</p>
<pre><code>db[self.seqNum] = self
</code></pre>
<p><code>db</code>现在显式表示<code>seqNum</code>到<code>NoteSet</code>的<em>映射,而不是基于数组索引的隐式关系。在</p>
<p>实际上,我还是建议这样做,因为它还可以解决从<code>db</code>中“免费”删除项的问题。也就是说,对于删除的实例之后的任何实例,执行<code>del db[instance.seqNum]</code>操作将使<code>seqNum</code>到{<cd1>}的所有映射完全无效。但是如果<code>db</code>是一个<code>dict</code>,那么这个操作会按照您的预期操作,并且所有的{<cd4>}值仍然映射到<code>db</code>中的正确实例。在</p>
<p>因此,为了把它们结合起来,我建议您将类更改为如下所示:</p>
<pre><code>import sys
import datetime
class NoteSet:
nextseqNum = 0
db = dict()
def __init__(self,name,description,hidden):
self.seqNum = NoteSet.nextseqNum
self.name = name
self.description = description
self.dateCreated = datetime.date.today()
self.hidden = hidden
self.notes = list()
NoteSet.db[self.seqNum] = self
print(self)
print(len(db))
NoteSet.nextseqNum += 1
</code></pre>