Python global全局变量跨函数调用报NameError未定义问题
问题根因
这个报错和「赋值逻辑写在循环内部」没有任何关系,核心问题有两个:
- 你从未调用过声明了
global img_file的open_image()函数。global关键字仅起到声明作用:告诉Python解释器,当前函数内如果对img_file做赋值操作,要修改全局作用域的同名变量,而不是创建函数局部变量。但函数定义本身不会执行内部代码,你从头到尾没跑过open_image(),里面的赋值逻辑根本没执行过,全局作用域里从来没有生成过img_file这个变量,直接调用image()打印变量自然会抛出NameError。 - 就算你补了
open_image()的调用,现有逻辑也实现不了「筛选存在对应txt文件的图片」的需求:
- 循环内每次碰到图片就会覆盖
img_file的值,最终只会保存遍历到的最后一个图片文件名,拿不到全部符合要求的图片 - 代码里完全没有编写「判断同名txt文件是否存在」的核心逻辑
- 不建议随意使用全局变量传递数据,很容易出现作用域相关的难以排查的bug,更稳妥的方式是通过函数返回值传递处理结果。
原报错最小验证
如果你只是想验证全局变量的问题,只需要在原代码调用image()之前,加上open_image()的调用,就不会触发NameError:
import os def open_image(): global img_file EXT = ['.jpeg','.png','.jpg'] path = os.getcwd() mydir = os.listdir(path) for i in mydir: k = os.path.splitext(i) if k[1] in EXT: img_file = k[0]+k[1] def image(): print(img_file) # 先执行open_image完成全局变量赋值 open_image() image()
运行这段代码会打印当前目录下遍历到的最后一个图片文件名,但这依然不符合你最初的功能需求。
符合需求的修正代码
import os def filter_matched_images(): IMAGE_EXTS = {'.jpeg', '.png', '.jpg'} current_dir = os.getcwd() all_files = os.listdir(current_dir) # 提前收集所有txt文件的文件名(不含后缀) txt_name_set = { os.path.splitext(f)[0] for f in all_files if f.endswith('.txt') } # 筛选所有带同名txt的图片 matched_images = [] for file in all_files: name, ext = os.path.splitext(file) if ext.lower() in IMAGE_EXTS and name in txt_name_set: matched_images.append(file) return matched_images if __name__ == "__main__": result = filter_matched_images() print("找到存在对应同名txt的图片共%d个:" % len(result)) for img in result: print("-", img)
内容的提问来源于stack exchange,提问作者Ankit Bista
相关产品推荐
相关产品推荐

