跨函数使用全局变量作为文件名时,如何保留其值并解决未定义报错?
解决全局变量跨函数保留值的问题
嘿,我来帮你搞定这个问题!你代码里的问题其实出在全局变量的声明顺序上,咱们一步步理清楚:
你在login()函数里先写了username = input(...),之后才加global username,这顺序完全反啦!Python会先把这个username当成函数内部的局部变量,后面的global声明根本起不到作用,导致全局范围里的username压根没被赋值,所以调用data()的时候自然会报错说变量未定义。
正确的写法很简单,给全局变量赋值前,必须先声明它是全局的,然后再执行赋值操作。而且要保证先运行login()给变量赋值,再调用data()用这个值。
修正后的代码是这样的:
def data(): # 这里直接用全局的username就行,只要它已经被全局赋值过 with open(username + '.txt', 'a') as f: f.write("\n") def login(): # 先声明:我要操作的是全局的username! global username # 再给全局变量赋值 username = input("What is your username? ") # 先执行登录流程,把全局username的值确定下来 login() # 再调用data函数,这时候username已经有值啦 data()
再给你解释下为啥这样就没问题:
login()里的global username提前告诉Python,接下来要赋值的是全局作用域里的变量,不是函数内部的局部变量,赋值后全局的username就有了用户输入的值。data()函数里使用username时,Python会先找局部有没有这个变量,找不到就去全局作用域找,这时候全局的username已经被login()设置好了,所以能顺利打开对应的文件做追加操作。
最后提几个小注意点:
- 一定要保证
login()在data()之前执行,不然全局变量还是未定义状态,依然会报错。 - 全局变量虽然好用,但在复杂项目里尽量少用,后续可以考虑用类封装或者参数传递的方式来替代,能让代码更清晰。
内容的提问来源于stack exchange,提问作者Gabriella Mariconda
相关产品推荐
相关产品推荐

