8

我正在创建一个简单的 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 变量添加值。

请帮忙

4

3 回答 3

12

课程不是这样运作的。数据应该存储在类实例中,而不是全局存储。

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
于 2013-04-25T08:50:18.953 回答
9

如果您引用的变量是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

于 2013-04-25T08:51:54.017 回答
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

但是,您的类实例不再有状态,因此在这里创建类没有意义。它只会混淆你的目的。

要么在实例中存储状态,要么使用全局函数(所以根本不要使用类);前者优于后者。

使用正确的 PEP-8 样式指南命名和字符串格式将您的设置转换为实例保持状态的类:

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(...),但状态被封装在一个实例中。

于 2013-04-25T08:51:30.757 回答