我创建了一个简单的python程序,它提供了SMS_Inbox的基本功能。我创建了一个SMS_Inbox方法。
store = []
message_count = 0
class sms_store:
def add_new_arrival(self,number,time,text):
store.append(("From: "+number, "Recieved: "+time,"Msg: "+text))
**message_count += 1**
def delete(self,i):
if i > len(store-1):
print("Index does not exist")
else:
del store[i]
message_count -= 1
在粗体位中我收到错误:
UnboundLocalError: local variable 'message_count' referenced before assignment.
我创建了一个全局变量存储,它是一个空列表,当我使用add_new_variable对象时,这个工作正常。但是由于某种原因,它没有向我的全局message_count变量添加值。
请帮忙
答案 0 :(得分:11)
那不是班级的运作方式。数据应存储在类实例中,而不是全局存储。
class SMSStore(object):
def __init__(self):
self.store = []
self.message_count = 0
def add_new_arrival(self,number,time,text):
self.store.append(("From: "+number, "Recieved: "+time,"Msg: "+text))
self.message_count += 1
def delete(self, i):
if i >= len(store):
raise IndexError
else:
del self.store[i]
self.message_count -= 1
sms_store = SMSStore()
sms_store.add_new_arrival("1234", "now", "lorem ipsum")
try:
sms_store.delete(20)
except IndexError:
print("Index does not exist")
print sms_store.store
# multiple separate stores
sms_store2 = SMSStore()
sms_store2.add_new_arrival("4321", "then", "lorem ipsum")
print sms_store2.store
答案 1 :(得分:8)
如果您引用的变量是message_count
,则错误是因为在Python中,您必须先将变量指定为global
,然后才能对其进行编辑。
这应该有用。
store = []
message_count = 0
class sms_store:
def add_new_arrival(self,number,time,text):
global message_count
store.append(("From: "+number, "Recieved: "+time,"Msg: "+text))
message_count += 1
def delete(self,i):
if i > len(store-1):
print("Index does not exist")
else:
global message_count
del store[i]
message_count -= 1
如上所述,您最好将其封装在__init__
函数中,而不是将其声明为global
。
答案 2 :(得分:1)
您试图分配给全局变量message_count
而不声明它:
message_count = 0
class sms_store:
def add_new_arrival(self,number,time,text):
store.append(("From: "+number, "Recieved: "+time,"Msg: "+text))
global message_count
message_count += 1
尽量避免使用全局变量,或者至少将变量封装为类属性:
class sms_store:
message_count = 0
store = []
def add_new_arrival(self,number,time,text):
sms_store.append(("From: "+number, "Recieved: "+time,"Msg: "+text))
sms_store.message_count += 1
但是,您的类实例不再具有状态,因此在此处创建类时没有 point 。它只会使你的目的混乱。
要么在实例中存储状态,要么使用全局函数(所以根本不要使用类);前者优于后者。
使用正确的PEP-8 styleguide命名和字符串格式将您的设置转换为实例保持状态的类:
class SMSStore(object):
def __init__(self):
self.store = []
self.message_count = 0
def add_new_arrival(self, number, time, text):
self.store.append('From: {}, Received: {}, Msg: {}'.format(number, time, text))
self.message_count += 1
然后您可以自由创建一个实例,并在需要时将其用作全局实例:
sms_store = SMSStore()
其他代码只使用sms_store.add_new_arrival(...)
,但状态封装在一个实例中。