如何动态更新字符串中的变量值?循环中变量未生效问题排查
问题根源与解决方案
问题出在哪?
你在循环外面一次性定义了error字符串,不管用f-string、拼接还是format,这些方式都是在执行语句的瞬间就把当时的n值(也就是1)嵌进字符串里了。之后n再递增,只会改变变量n的值,已经生成的error字符串是不可变的,不会跟着更新,所以每次打印的都是最初的"Error word 1"。
几种可行的解决办法
方法1:在函数内动态生成错误字符串
把error的定义移到函数内部,每次调用函数时根据当前的n值生成最新的字符串:
n = 1 def test(word): global n if len(word) > 5: error = f"Error word {n}" print(error) ar = ['pizza', 'toasts', 'ham', 'mayo', 'houses'] for word in ar: test(word) n += 1
方法2:把索引作为参数传给函数(更规范,避免全局变量)
用enumerate直接获取循环的索引,传给test函数,不用依赖全局变量n:
def test(word, idx): if len(word) > 5: print(f"Error word {idx}") ar = ['pizza', 'toasts', 'ham', 'mayo', 'houses'] for n, word in enumerate(ar, start=1): test(word, n)
方法3:复用错误格式字符串
如果要统一错误信息的格式,可以把格式模板单独存起来,每次使用时传入当前的索引值:
error_template = "Error word {}" def test(word, idx): if len(word) > 5: print(error_template.format(idx)) ar = ['pizza', 'toasts', 'ham', 'mayo', 'houses'] for n, word in enumerate(ar, start=1): test(word, n)
内容的提问来源于stack exchange,提问作者FSVieira
相关产品推荐
相关产品推荐

