【发布时间】:2023-03-16 06:50:01
【问题描述】:
我有一个名为Maps 的类,我从中创建了两个列表l 和lm。 l 应该随着某些事件而改变,但 lm(内存列表)应该保持原样。
有没有办法防止我的列表类发生变化? 认识你!
class Maps(list):
def createInitial(self, lvlC):
#self.extend(mapDico[lvlC.value])
#get (i,j) coords of "i" in l
def findI(self):
for ordinate, abscissa in enumerate(self):
try:
return (ordinate, abscissa.index("i"))
except:
pass
#get number of "x" in lm
def countX(self):
nbX=0
for rows in range(len(self)):
for elements in range(len(self)):
if self[rows][elements]=="x":
nbX+=1
return nbX
#load next map
def nextLevel(self, nxtL):
del self[:]
self.extend(mapDico[nxtL])
lvlC=Counters()
lm=Maps()
lm.createInitial(lvlC)
l=Maps()
l.createInitial(lvlC)
这里开始“控制器”文件:
if goalC.value>0 and goalC.value==lm.countX():
lvlC.increment(1)
#lvl.config(text=" | Level Complete ", bg="limegreen")
l.nextLevel(lvlC.value)
lm.nextLevel(lvlC.value)
muvC.reinitialize()
nbMuv.config(text="Moves: "+str(muvC.value))
pushC.reinitialize()
nbPush.config(text=" | Pushes: "+str(pushC.value))
goalC.reinitialize()
nbGoal.config(text=" | Goals: "+str(goalC.value))
lvl.config(text=" | Current level: "+str(lvlC.value), bg="darkgray")
print("New moves",muvC.value, "New pushes",pushC.value, "New level",lvlC.value)
print("New countX: ", lm.countX())
print("New goals: ", goalC.value)
for i in l:
print(i)
for i in lm:
print(i)
can.delete("all")
for i in r:
for j in r:
time.sleep(.005)
can.create_rectangle(j*n, i*n, j*n+n, i*n+n, fill=fillSquare(i,j, l), outline="darkslategray")
【问题讨论】:
-
“防止改变”是什么意思?事情不会自己改变,一定有什么东西在改变它。您发布的代码不足以弄清楚发生了什么或您想要什么;请尝试创建一个minimal reproducible example。
-
确实有一种非常简单的方法可以“防止(你的)列表类改变”:不要改变它。如果这不能回答您的问题,您可能需要用更具体的细节和用例重新表述您的问题。
-
另外:继承(实现继承——但这是在 Python 中使用继承的唯一原因)主要是一种非常残缺的组合/委托形式。我强烈建议你改用组合/委托重写你的
Maps类。一开始需要做更多的工作,但它可以让您完全控制实施并提供更大的灵活性。 -
请注意,
Maps() + []将返回[]。所以要拥有一个合适的子类,你必须重新实现很多方法。 -
好吧,我正在开发一款我制作事件的游戏,他们会修改
l列表。我只希望该列表响应事件。但即使我没有给出更改lm的指示,它也确实发生了变化。我会加入我的整个代码,但它会占用页面。 ^^>