Python变量无法打印?如何在循环/条件外获取变量
函数外部无法访问全局变量dir_name的原因与解决办法
问题代码
import os # 注意:原代码缺少os模块导入,运行会报错 global dir_name dir_name = '' def generateDirectoryName(newpath, x=0): while True: dir_name = (newpath + ('_' + str(x) if x != 0 else '')).strip() if not os.path.exists(dir_name): os.mkdir(dir_name) #1 #print(dir_name) return dir_name else: x = x + 1 def createDirectory(): generateDirectoryName(newpath) def main(): cwd = os.getcwd() createDirectory() #2 print(dir_name) main() #3 print(dir_name)
问题原因
- 函数内的dir_name是局部变量:虽然你在全局作用域声明了
dir_name,但在generateDirectoryName函数内部直接赋值dir_name = ...时,Python会默认将这个变量视为局部变量,而非修改全局的dir_name。也就是说,函数内的dir_name和全局的dir_name是两个完全独立的变量。 - 全局dir_name始终是空字符串:你看到取消#1注释后能显示目录名,那是函数内局部变量的值,全局的
dir_name自始至终都是初始的空字符串'',所以外部的print(dir_name)输出空内容,看起来像“无输出”。
解决办法
方法一:显式声明使用全局变量
在generateDirectoryName函数开头加上global dir_name,告诉Python要操作的是全局变量:
def generateDirectoryName(newpath, x=0): global dir_name # 声明使用全局变量 while True: dir_name = (newpath + ('_' + str(x) if x != 0 else '')).strip() if not os.path.exists(dir_name): os.mkdir(dir_name) return dir_name else: x = x + 1
这样函数内的赋值会直接修改全局的dir_name,外部的print就能拿到正确的目录名。
方法二:利用函数返回值更新全局变量
既然generateDirectoryName已经返回了生成的目录名,我们可以在调用时把返回值赋值给全局dir_name,这种方式更符合编程规范,减少全局变量的直接操作:
def createDirectory(): # 让函数返回生成的目录名 return generateDirectoryName(newpath) def main(): global dir_name cwd = os.getcwd() # 将返回值赋值给全局变量 dir_name = createDirectory()
额外提示
原代码缺少import os语句,运行会抛出NameError,记得在代码开头添加import os;另外newpath变量未定义,需要提前赋值(比如newpath = 'my_directory')才能正常运行。
内容的提问来源于stack exchange,提问作者JM1
相关产品推荐
相关产品推荐

