如何在python中定义全局列表

时间:2011-09-12 09:48:22

标签: python

我有两种方法应该写入同一个列表。

class MySpider():

    def parse_post(self, response):
        commentList = []
        ...  
        commentList.append(someData)

    def parse_comments(self, response):
        commentList = []
        ...  
        commentList.append(someData)

在这段代码中有两个commentList列表,但我需要一个列表,我可以在其中附加数据。我想在这个类的任何方法中访问此列表。我试过

class MySpider():

    commentNum = []

    def parse_post(self, response):
        ...  
        commentList.append(someData)

    def parse_comments(self, response):
        ...  
        commentList.append(someData)

但这给了我一个错误global name commentList is not defined。有关如何在该类的所有方法中访问的单个列表的任何想法吗?

4 个答案:

答案 0 :(得分:4)

一种方法是简单地通过其全名(MySpider.commentList)引用变量:

class MySpider(object):

    commentList = []

    def parse_post(self, response):
        ...  
        MySpider.commentList.append(someData)

    def parse_comments(self, response):
        ...  
        MySpider.commentList.append(someData)

这样MySpider的所有实例都会共享相同的变量

如果您可能有多个MySpider实例,并希望每个实例都有自己的commentList,那么只需在构造函数中创建它并将其称为self.commentList

class MySpider(object):

    def __init__(self):    
        self.commentList = []

    def parse_post(self, response):
        ...  
        self.commentList.append(someData)

    def parse_comments(self, response):
        ...  
        self.commentList.append(someData)

如果两个版本都适用于您的情况,我建议使用后者。

答案 1 :(得分:2)

看起来你正在使用Scrapy。如果列表是Item的一部分,我通常使用Request / Response对象的meta参数将该项传递给另一个回调。

答案 2 :(得分:1)

只需self.commentList.append(someData)

(请注意,正常的Python样式是使用comment_listsome_data。)

答案 3 :(得分:1)

只需将其设为实例属性:

class MySpider(object):
    def __init__(self):
        self.comment_list = []
    def parse_post(self, response):
        ...  
        self.comment_list.append(someData)

实例(按照约定在python中self,在java中为this例如)在python中是显式的。

如果在方法之外初始化数组(比如在第二个列表中),则将其设置为类属性(即静态属性),对所有实例都是“全局”的,并且应使用全名{{ 1}}或MySpider.comment_list如果你想避免类名(例如继承)。由于查找属性,type(self).comment_list也可以工作(如果在实例级别找不到属性,则查找该类)但区别不太明显(“显式优于隐式”)。