我知道使用全局变量不是一个好主意,我打算做一些不同的事情。但是,在玩游戏时,我在Scrapy中遇到了一个奇怪的全局变量问题。在纯python中,我没有看到这个问题。
当我运行此机器人代码时:
import scrapy
from tutorial.items import DmozItem
class DmozSpider(scrapy.Spider):
name = "dmoz"
allowed_domains = ["lib-web.org"]
start_urls = [
"http://www.lib-web.org/united-states/public-libraries/michigan/"
]
count = 0
def parse(self, response):
for sel in response.xpath('//div/div/div/ul/li'):
item = DmozItem()
item['title'] = sel.xpath('a/text()').extract()
item['link'] = sel.xpath('a/@href').extract()
item['desc'] = sel.xpath('p/text()').extract()
global count;
count += 1
print count
yield item
DmozItem:
import scrapy
class DmozItem(scrapy.Item):
title = scrapy.Field()
link = scrapy.Field()
desc = scrapy.Field()
我收到此错误:
File "/Users/Admin/scpy_projs/tutorial/tutorial/spiders/dmoz_spider.py", line 22, in parse
count += 1
NameError: global name 'count' is not defined
但如果我只是将'count + = 1'更改为'count = 1',它运行正常。
这里发生了什么?为什么我不能增加变量?
同样,如果我在Scrapy上下文之外运行类似的代码,在纯Python中运行正常。这是代码:
count = 0
def doIt():
global count
for i in range(0, 10):
count +=1
doIt()
doIt()
print count
导致:
Admin$ python count_test.py
20
答案 0 :(得分:3)
count
在您的示例中是class variable,因此您应该使用self.count
访问它。它解决了错误,但也许您真正需要的是instance variable,因为作为类变量,count
在类的所有实例之间共享。
在count = 1
方法中分配parse
是有效的,因为它会创建一个名为count
的新本地变量,它与类变量{{1}不同}。
你的纯Python示例是有效的,因为你没有定义一个类,而是一个函数,而你在那里创建的变量count
具有全局作用域,可以从函数作用域中访问。