错误类似
下面这段代码是报错的,如下:
# 假设load_dataset_out和main函数都在同一个代码文件中
def load_dataset_out():
# ...函数实现...
return 1
# 在文件开始处调用load_dataset_out,确保这一行在main函数定义之前
test_nid = load_dataset_out()
def main(getlist=['AP','APA','APT','APV'], not_in_list=['APAP','APTP','APVP','APAPA','APAPT','APAPV','APTPA','APTAT','APTAV',
'APVAP','APVAT','APVAV'], temp_name=(0,1,2,3,4), ss=False):
# 在这里,直接使用test_nid,因为它是在全局作用域中定义的
print(test_nid)
test_nid = 2
if __name__ == "__main__":
# 调用main函数时不需要传递任何参数,除非main函数需要它们
main()
会出现错误:
Traceback (most recent call last):
File "d:/lithbench/lithobench-main/lithobench-main/test.py", line 19, in <module>
main()
File "d:/lithbench/lithobench-main/lithobench-main/test.py", line 13, in main
print(test_nid)
UnboundLocalError: local variable 'test_nid' referenced before assignment
而下面这段是没错的。
# 假设load_dataset_out和main函数都在同一个代码文件中
def load_dataset_out():
# ...函数实现...
return 1
# 在文件开始处调用load_dataset_out,确保这一行在main函数定义之前
test_nid = load_dataset_out()
def main(getlist=['AP','APA','APT','APV'], not_in_list=['APAP','APTP','APVP','APAPA','APAPT','APAPV','APTPA','APTAT','APTAV',
'APVAP','APVAT','APVAV'], temp_name=(0,1,2,3,4), ss=False):
# 在这里,直接使用test_nid,因为它是在全局作用域中定义的
print(test_nid)
if __name__ == "__main__":
# 调用main函数时不需要传递任何参数,除非main函数需要它们
main()
看出来问题在哪里了吗?
是的,在main函数里,test_nid本来应该是全局变量,但是python在阅读代码的时候,知道test_nid后续会被修改,认定他是局部变量,而局部变量test_nid在定义前输出print,由此报错。
解决方案
1、如果真需要在局部函数里修改test_nid的值,则在函数里添加上global 声明。
# 假设load_dataset_out和main函数都在同一个代码文件中
def load_dataset_out():
# ...函数实现...
return 1
# 在文件开始处调用load_dataset_out,确保这一行在main函数定义之前
test_nid = load_dataset_out()
def main(getlist=['AP','APA','APT','APV'], not_in_list=['APAP','APTP','APVP','APAPA','APAPT','APAPV','APTPA','APTAT','APTAV',
'APVAP','APVAT','APVAV'], temp_name=(0,1,2,3,4), ss=False):
global test_nid
# 在这里,直接使用test_nid,因为它是在全局作用域中定义的
print(test_nid)
test_nid = 2
if __name__ == "__main__":
# 调用main函数时不需要传递任何参数,除非main函数需要它们
main()
此时函数修改test_nid的值在全局下都会改变。
2、要使用全局变量,而不需要修改,那只需要避免在后续的代码中,对他进行赋值操作。 即,去掉test_nid=2这行即可
# 假设load_dataset_out和main函数都在同一个代码文件中
def load_dataset_out():
# ...函数实现...
return 1
# 在文件开始处调用load_dataset_out,确保这一行在main函数定义之前
test_nid = load_dataset_out()
def main(getlist=['AP','APA','APT','APV'], not_in_list=['APAP','APTP','APVP','APAPA','APAPT','APAPV','APTPA','APTAT','APTAV',
'APVAP','APVAT','APVAV'], temp_name=(0,1,2,3,4), ss=False):
# 在这里,直接使用test_nid,因为它是在全局作用域中定义的
print(test_nid)
if __name__ == "__main__":
# 调用main函数时不需要传递任何参数,除非main函数需要它们
main()