赋值之前引用的局部变量?[重复]

2025-02-21 08:47:00
admin
原创
27
摘要:问题描述:我正在使用 PyQt 库截取网页的屏幕截图,然后读取包含不同 URL 的 CSV 文件。我保存了一个变量 feed,每次处理 URL 时它都会递增,因此应该递增到 URL 的数量。代码如下:webpage = QWebPage() fo = open("C:/Users/Romi/Desk...

问题描述:

我正在使用 PyQt 库截取网页的屏幕截图,然后读取包含不同 URL 的 CSV 文件。我保存了一个变量 feed,每次处理 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
')
    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
')
    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')

知道为什么吗?


解决方案 1:

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

feed = ...

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

global feed

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

如果没有 global 语句,由于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

函数改变全局变量的问题在于,它使代码更难理解。函数不再是孤立的单元。它们的交互扩展到影响全局变量或受全局变量影响的一切。因此,它使大型程序更难理解。

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

解决方案 2:

将全局语句放在你的函数顶部,这样就好了:

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中命名的局部变量。但是,由于的局部范围内x += 1没有定义,因此它会引发错误。x`t`

解决方案 3:

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

这里的解决方案是添加

global feed

到您的函数(通常靠近顶部)来向解释器指示 feed 变量不是该函数的本地变量。

解决方案 4:

在我的情况下,同样的错误是由拼写错误引起的!我以为我的变量名称是

varAlpha

但在我定义的代码中

varalpha

& 收到错误

UnboundLocalError: local variable 'varAlpha' referenced before assignment

当调用varAlpha

我希望它能帮助有一天搜索该错误并感到疑惑的人(因为我对该错误的搜索将我引到这里,而与使用全局或非全局无关,这是一个令人困惑的问题!)

解决方案 5:

您可以对函数范围执行此类操作

def main()

  self.x = 0

  def incr():
    self.x += 1
  
  for i in range(5):
     incr()
  
  print(self.x)
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1325  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。它涵盖了从产品概念产生到产品退市的整个生命周期,通过整合跨部门团队、优化流程等方式,显著提升产品开发的效率和质量,进而为项目的成功奠定坚实基础。深入探究IPD流程的五个阶段与项目成功之间...
IPD流程分为几个阶段   4  
  华为作为全球知名的科技企业,其成功背后的管理体系备受关注。IPD(集成产品开发)流程作为华为核心的产品开发管理模式,其中的创新管理与实践更是蕴含着丰富的经验和深刻的智慧,对众多企业具有重要的借鉴意义。IPD流程的核心架构IPD流程旨在打破部门墙,实现跨部门的高效协作,将产品开发视为一个整体的流程。它涵盖了从市场需求分析...
华为IPD是什么   3  
  IPD(Integrated Product Development)研发管理体系作为一种先进的产品开发模式,在众多企业的发展历程中发挥了至关重要的作用。它不仅仅是一套流程,更是一种理念,一种能够全方位提升企业竞争力,推动企业持续发展的有效工具。深入探究IPD研发管理体系如何助力企业持续发展,对于众多渴望在市场中立足并...
IPD管理流程   3  
  IPD(Integrated Product Development)流程管理旨在通过整合产品开发流程、团队和资源,实现产品的快速、高质量交付。在这一过程中,有效降低成本是企业提升竞争力的关键。通过优化IPD流程管理中的各个环节,可以在不牺牲产品质量和性能的前提下,实现成本的显著降低,为企业创造更大的价值。优化产品规划...
IPD流程分为几个阶段   4  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用