在Python中赋值之前引用的局部变量?

发布于 2021-01-29 15:21:15

我正在使用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')

知道为什么吗?

关注者
0
被浏览
162
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    当Python解析函数定义的主体并遇到诸如

    feed = ...
    

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

    global feed
    

    在函数定义中。全局语句不必位于函数定义的开头,而通常位于该处。无论放置在何处,全局声明都会在函数中的 任何位置 创建feed一个全局变量。 __

    如果没有全局语句,feed则当Python执行时,因为被视为局部变量

    feed = feed + 1,
    

    Python首先评估右侧,然后尝试查找feed的值。第一次查找feed未定义。因此,错误。

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

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

    具有使全局变量发生变异的函数的问题在于,使代码更难处理。功能不再是孤立的单元。它们的交互作用扩展到影响全局变量或受全局变量影响的所有事物。因此,它使大型程序更难以理解。

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看