我试图让用户创建一个名为NoteSet的对象,每个NoteSet都会被放入一个名为db的全局列表中。这是我试图做到这一点:
import sys
import datetime
db = list()
class NoteSet:
nextseqNum = 0
def __init__(self,name,description,hidden):
global db
self.seqNum = Note.nextseqNum
self.name = name
self.description = description
self.dateCreated = datetime.date.today()
self.hidden = hidden
self.notes = list()
db[self.seqNum] = self
print(self)
print(len(db))
Note.nextseqNum += 1
当我尝试创建一个对象时,例如:
NoteSet('example','ex',True)
它给了我错误
追踪(最近一次通话): 文件"",第1行,in NoteSet('例如''前',真) 文件" C:\ Users \ Brandon \ Desktop \ step5.py",第22行, init db [self.seqNum] = self IndexError:列表分配索引超出范围
这是制作全局对象列表的正确方法吗?
答案 0 :(得分:0)
您收到此错误是因为db
中没有元素(python列表初始化为长度为0),因此当您尝试替换位置self.seqNum
处的元素时,您将获得无效索引。它与它的全球性无关。
如果我们假设这个全局列表只能以线程安全的方式访问,那么您应该能够做到:
db.appened(self)
相反。但是,正如评论中所提到的,如果此类是“守门员”,则在此用例中更有意义的是使db
成为类变量。与db列表连接。
<强>更新强>
在评论中解决OP的问题,
我希望能够通过seqNum跟踪列表中对象的位置
正如当前所写的那样,seqNum
将始终与每个新的NoteSet
实例一起线性增加。如果我们假设Note.nextseqNum
的线程安全访问权限,那么您通过db[self.seqNum]
尝试执行的操作已经通过db.append(self)
隐式完成,因为len(db) == Note.nextseqNum
始终是。db
。目前,我们会忽略如果您从seqNum
中删除 删除 元素后会发生什么,因为现在您的系统没有帐户对于那个,并且无论如何都会彻底破坏。
但是,如果将来db
在每次制作新实例时都不会永远单调增加,那么您只需将dict
设为list
而不是db = dict()
db[self.seqNum] = self
:
db
然后将新实例完全插入到当前,
seqNum
NoteSet
现在明确表示db
到del db[instance.seqNum]
的映射,而不是基于数组索引的隐式关系。
我实际上建议这样做,因为它还可以解决从seqNum
删除免费项目的问题。实际上,对于在删除的实例之后出现的任何实例,执行db
将使db
到dict
的所有映射完全无效。但如果seqNum
是db
,则此操作会按预期执行,并且所有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
值仍会映射到{{1}}中的正确实例。
所以,为了把它们整合在一起,我建议你改变你的课程,如下所示:
{{1}}
答案 1 :(得分:0)
正如@aruisdante所说,你需要附加到列表
试试这个:
db = []
class ListObj:
def __init__(self, name, msg, hide=False):
self.name = name
self.msg = msg
self.hide = hide
db.append(self)
祝你好运!