Python脚本循环调用函数时报错'str' object is not callable及变量管理求助
解决你的Python脚本错误与变量管理问题
咱们一步步来解决你遇到的两个问题,先搞定那个烦人的'str' object is not callable错误:
一、修复'str' object is not callable错误
这个错误的根源特别直接——你在main()函数里不小心把函数名main当成普通变量用了:
main = input("")
执行这行代码后,原本指向main()函数的标识符被覆盖成了用户输入的字符串。之后你递归调用main()时,其实是在尝试调用一个字符串,这肯定会报错啊!
修复方法:把这个变量名改成别的,比如user_choice,避免和函数名冲突:
def main(): global DNA global Smartness global cases global deaths global recovered print("Do your actions: ") # 把变量名从main改成user_choice,避免覆盖函数引用 user_choice = input("") if user_choice == "1": cases() print("") main() elif user_choice == "2": deaths() print("") main() elif user_choice == "3": recovered() print("") main() elif user_choice == "4": DNA() print("") main() elif user_choice == "5": Smartness() print("") main() else: print("Only chose a number between 1 and 5!") main()
二、管理变量让记事本可以访问
要让变量能被记事本读取,本质就是把变量值保存到文本文件里。这里给你两种简单实用的方案:
方案1:普通文本文件存储(简单直观)
写一个函数,把需要保存的变量按变量名: 值的格式写入txt文件,记事本直接就能打开查看:
def save_vars_to_txt(): # 把所有需要保存的变量放进字典,方便批量处理 vars_to_save = { "China_3": China_3, "India_3": India_3, "USA_3": USA_3, "DNA": DNA, "Smartness": Smartness, # 把你需要的其他变量都加进来 } # 写入文件,覆盖旧内容 with open("virus_data.txt", "w", encoding="utf-8") as f: for var_name, var_value in vars_to_save.items(): f.write(f"{var_name}: {var_value}\n")
你可以在每次修改变量后,或者程序结束前调用这个函数,生成的virus_data.txt用记事本打开就能看到所有变量的内容。
方案2:JSON格式存储(结构清晰)
JSON是结构化的存储格式,排版整齐,记事本打开也一目了然,而且后续如果需要读取变量回来继续用也更方便:
import json def save_vars_to_json(): vars_to_save = { "China_3": China_3, "India_3": India_3, "USA_3": USA_3, "DNA": DNA, "Smartness": Smartness, # 其他需要保存的变量... } # 写入JSON文件,indent=4让格式更美观 with open("virus_data.json", "w", encoding="utf-8") as f: json.dump(vars_to_save, f, indent=4)
如果之后要从文件里加载变量,也可以写个读取函数:
def load_vars_from_json(): global China_3, India_3, USA_3, DNA, Smartness with open("virus_data.json", "r", encoding="utf-8") as f: saved_vars = json.load(f) # 把加载的变量赋值给全局变量 China_3 = saved_vars["China_3"] India_3 = saved_vars["India_3"] USA_3 = saved_vars["USA_3"] DNA = saved_vars["DNA"] Smartness = saved_vars["Smartness"] # 其他变量依次赋值
另外提醒一句:你在recovered()函数里用到的China_3、India_3这些变量,最好也在函数里用global声明,或者考虑把所有变量放进一个类里管理,这样能避免很多变量未定义的问题。
内容的提问来源于stack exchange,提问作者Dylan
相关产品推荐
相关产品推荐

