赋值之前引用的局部变量?[重复]
- 2025-02-21 08:47:00
- admin 原创
- 27
问题描述:
我正在使用 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)
- 2025年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)