You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python global全局变量跨函数调用报NameError未定义问题

问题根因

这个报错和「赋值逻辑写在循环内部」没有任何关系,核心问题有两个:

  1. 你从未调用过声明了global img_file的open_image()函数。
    global关键字仅起到声明作用:告诉Python解释器,当前函数内如果对img_file做赋值操作,要修改全局作用域的同名变量,而不是创建函数局部变量。但函数定义本身不会执行内部代码,你从头到尾没跑过open_image(),里面的赋值逻辑根本没执行过,全局作用域里从来没有生成过img_file这个变量,直接调用image()打印变量自然会抛出NameError。
  2. 就算你补了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 11:51:17