Python:for循环内用any()后print(x)报NameError原因咨询
为什么
print(x)会报NameError,而print(line)可以正常运行? 嗨,这个问题核心在于Python的变量作用域,咱们来拆解清楚:
问题出在哪?
你写的这段代码里:
if any(x in line.upper() for x in list_keywords): print(x)
这里的x是生成器表达式内部的局部变量——它只在any()函数执行时,迭代list_keywords的过程中存在。一旦any()完成判断(不管是找到匹配项返回True,还是遍历完所有关键词返回False),这个x就会被销毁,不在当前的循环体作用域里了。所以当你在print(x)时,Python找不到这个变量,就抛出了NameError: name 'x' is not defined。
而print(line)能正常运行,是因为line是外层for循环的变量,它的作用域覆盖了整个循环体,所以你在if代码块里访问它完全没问题。
怎么修改才能打印匹配到的关键词?
如果你想打印触发匹配的那个关键词,可以换一种写法,先找到匹配的关键词再输出:
方法1:遍历关键词找第一个匹配项
list_keywords=['DROP','CREATE','ALTER','COMMENT'] # 推荐用with语句自动管理文件资源,避免忘记关闭 with open(filename) as file: for line in file: upper_line = line.upper() matched_keyword = None for x in list_keywords: if x in upper_line: matched_keyword = x break # 找到第一个匹配的就停止遍历 if matched_keyword: print(matched_keyword)
方法2:收集所有匹配的关键词(支持一行多匹配)
如果一行里可能存在多个关键词需要打印,可以用列表推导式收集所有匹配项:
list_keywords=['DROP','CREATE','ALTER','COMMENT'] with open(filename) as file: for line in file: upper_line = line.upper() # 收集当前行中所有匹配的关键词 matched_keywords = [x for x in list_keywords if x in upper_line] if matched_keywords: for keyword in matched_keywords: print(keyword)
内容的提问来源于stack exchange,提问作者J K
相关产品推荐
相关产品推荐

