赋值前引用的局部变量?

2024-10-05 10:18:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用PyQt库拍摄网页截图,然后读取不同URL的CSV文件。我保留了一个变量提要,它在每次处理URL时都会递增,因此应该递增到URL的数量

以下是代码:

webpage = QWebPage()
fo = open("C:/Users/Romi/Desktop/result1.txt", "w")
feed = 0
def onLoadFinished(result):
    #fo.write( column1[feed])#, column2[feed], urls[feed])
   #feed = 0
   if not result:
        print "Request failed"
    fo.write(column1[feed])
    fo.write(',')
    fo.write(column2[feed])
    fo.write(',')
    #fo.write(urls[feed])
    fo.write(',')
    fo.write('404,image not created\n')
    feed = feed + 1
        sys.exit(1)
        save_page(webpage, outputs.pop(0))   # pop output name from list and save
   if urls:
        url = urls.pop(0)   # pop next url to fetch from list
        webpage.mainFrame().load(QUrl(url))
    fo.write(column1[feed])#,column2[feed],urls[feed],'200','image created','/n')
    fo.write(',')
    fo.write(column2[feed])
    fo.write(',')
    #fo.write(urls[feed])
    fo.write(',')
    fo.write('200,image created\n')
    feed = feed + 1
   else:
        app.quit()  # exit after last url

webpage.connect(webpage, SIGNAL("loadFinished(bool)"), onLoadFinished)
webpage.mainFrame().load(QUrl(urls.pop(0)))
#fo.close()
sys.exit(app.exec_())

它给了我一个错误:

local variable feed referenced before the assignment at fo.write(column1[feed])#,column2[feed],urls[feed],'200','image created','/n')

知道为什么吗


Tags: imageurlfeedexitresulturlspopwrite
3条回答

将全局语句放在函数的顶部,您应该表现良好:

def onLoadFinished(result):
    global feed
    ...

为了证明我的意思,请看下面这个小测试:

x = 0
def t():
    x += 1
t()

这与您的错误完全相同,其中:

x = 0
def t():
    global x
    x += 1
t()

没有

原因是,在t内部,Python认为x是一个局部变量。此外,除非您明确告诉它x是全局变量,否则它将尝试在x += 1中使用名为x的局部变量。但是,由于在t的局部作用域中没有定义x,因此会抛出一个错误

当Python解释器读取函数的定义(或者,我认为,甚至是一块缩进的代码)时,分配给函数内部的所有变量都被添加到该函数的局部变量中。如果在赋值之前本地没有定义,Python解释器就不知道该做什么,因此会抛出此错误

这里的解决方案是添加

global feed

向您的函数(通常在顶部附近)发送,以向解释器指示提要变量不是此函数的局部变量

当Python解析函数定义的主体并遇到如下赋值时

feed = ...

默认情况下,Python将feed解释为局部变量。如果不希望它成为局部变量,则必须将

global feed

在函数定义中。global语句不必位于函数定义的开头,但它通常位于该位置。无论放置在何处,全局声明都会使feed成为函数中处处的全局变量

没有全局语句,因为在Python执行时feed被视为局部变量

feed = feed + 1,

Python首先计算右侧,然后尝试查找提要的值。第一次通过它发现feed是未定义的。因此出现了错误

修补代码的最短方法是将global feed添加到onLoadFinished的开头。更好的方法是使用类:

class Page(object):
    def __init__(self):
        self.feed = 0
    def onLoadFinished(self, result):
        ...
        self.feed += 1

使用变异全局变量的函数的问题在于,它使代码更难修改。功能不再是孤立的单元。它们的交互作用延伸到影响全局变量或受全局变量影响的所有事物。因此,它使得更大的程序更难理解

通过避免全局变量的变异,从长远来看,您的代码将更易于理解、测试和维护

相关问题 更多 >

    热门问题