我正在尝试在条件完成时删除类的实例。 但是我遇到了问题,因为它在进入条件之前被删除了。 我不知道发生了什么...... 代码使用wxpython和一些按钮来删除ítems,所以我在init上正确构建按钮但是当我尝试删除一个ítem时,在它到达第一个条件之前,它似乎被las条件删除了,应该永远不会之前。 所以我不知道问题来自哪里...... 我第一次按下“deleteitem”按钮时得到的错误是:
'在赋值之前引用的局部变量'T'(在第6行:...如果T.items> 0:)
但如果我删除最后一行del(T),它不会给出任何错误。
以下是基本代码:
class Test(object):
def __init__(self):
self.items=8
T=Test()
if button.GetName()=='deleteitem':
if T.items>0:
T.items-=1
if T.items<0:
del(T)
编辑:
好的,正如我首先发布的示例可以工作,这里的代码不起作用:
import wx
class Test(object):
def __init__(self):
self.items=8
T=Test()
class MyFrame(wx.Frame):
def __init__(self, parent, title):
wx.Frame.__init__(self, parent, -1, title,
pos=(150, 150), size=(350, 200))
self.btn = wx.Button(self, -1, "Press to delete Item, current Items: "+str(T.items))
self.Bind(wx.EVT_BUTTON, self.OnButton, self.btn)
def OnButton(self, evt):
print 'Current Items: '+str(T.items)
self.btn.SetLabel('Press to delete Item, current Items: '+str(T.items))
if T.items>0:
T.items-=1
if T.items==0:
del(T)
class MyApp(wx.App):
def OnInit(self):
frame = MyFrame(None, "Simple wxPython App")
frame.Show(True)
return True
app = MyApp()
app.MainLoop()
最终工作代码:
import wx
class Test(object):
def __init__(self):
self.items=8
class MyFrame(wx.Frame):
def __init__(self, parent, title):
self.T=Test()
wx.Frame.__init__(self, parent, -1, title,
pos=(150, 150), size=(350, 200))
self.btn = wx.Button(self, -1, "Press to delete Item, current Items: "+str(self.T.items))
self.Bind(wx.EVT_BUTTON, self.OnButton, self.btn)
def OnButton(self, evt):
if self.T.items>0:
self.T.items-=1
if self.T.items==0:
del(self.T)
self.btn.SetLabel('Deleted instance T')
else:
self.btn.SetLabel('Press to delete Item, current Items: '+str(self.T.items))
print 'current Items: '+str(self.T.items)
class MyApp(wx.App):
def OnInit(self):
frame = MyFrame(None, "Simple wxPython App")
frame.Show(True)
return True
app = MyApp()
app.MainLoop()
答案 0 :(得分:0)
你遗漏了一些相关的代码,因为这段代码:
class Test(object):
def __init__(self):
self.items=8
T=Test()
if True:
if T.items>0:
T.items-=1
if T.items<0:
del(T)
执行没有错误。
在任何情况下,听起来您的代码都是Variable scope in nested functions的变体。
对新代码的回复:
据我所知,del
本地化了一个变量:
示例1:
class Test(object):
def __init__(self):
self.items=8
T = Test()
class Dog(object):
def dostuff(self):
print 'executing dostuff()'
if T.items > 10: #This will never be True
T
Dog().dostuff()
--output:--
executing dostuff()
示例2:
class Test(object):
def __init__(self):
self.items=8
T = Test()
class Dog(object):
def dostuff(self):
print 'executing dostuff()'
if T.items > 10: #This will never be True
del T
Dog().dostuff()
--output:--
executing dostuff()
Traceback (most recent call last):
File "1.py", line 14, in <module>
Dog().dostuff()
File "1.py", line 10, in dostuff
if T.items > 10:
UnboundLocalError: local variable 'T' referenced before assignment
所以看起来解析器将T标记为dostuff()函数中的局部变量 - 因为你只能del
本地名称(除非你声明T在dostuff()中是全局的)。结果,python不会在dostuff()函数外面看到T的值。
因此,另一种解决方案(不推荐)是这样做的:
class Test(object):
def __init__(self):
self.items=8
T = Test()
class Dog(object):
def dostuff(self):
global T #<===HERE
print 'executing dostuff()'
if T.items > 10:
del T
Dog().dostuff()
--output:--
executing dostuff()
要解决您的问题,我会将以下内容添加到__init__()
函数的末尾:
self.T = Test()
或者,您可以将T作为参数传递给__init__()
。它通常被认为是一种糟糕的程序设计,在一个类中操作全局变量。