【关于全局变量在函数显示未引用】

关于全局变量在函数显示未引用

错误类似

下面这段代码是报错的,如下:

# 假设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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值