Python如何将word值存入usedDB.py的used_words_list列表
核心实现原理
用from usedDB import used_words_list导入列表时,本质是把usedDB模块中used_words_list的对象引用加载到当前程序的内存空间,这里有两个关键逻辑:
- 列表是可变类型,原地调用
append()、extend()这类方法修改时,所有引用这个列表的位置都会拿到更新后的值;但如果直接给变量名做赋值操作(比如used_words_list = [新值]),只会让当前作用域的变量指向新对象,不会修改原模块的列表,更不会改动磁盘上的文件。 - 所有内存中的修改会在程序退出后直接清空,不会自动同步回磁盘上的
usedDB.py文件。要实现持久化存储(程序重启后数据仍保留),必须手动通过文件IO操作把更新后的内容写回磁盘。
可选实现方案
方案1:运行时临时追加(不修改磁盘文件,程序重启后数据重置)
适合只需要在程序运行期间记录单词、不需要永久保存的场景,直接调用列表的append()方法做原地修改即可,不需要额外操作文件。
修正后的主程序代码:
from usedDB import used_words_list # 补全原代码缺失的依赖导入 from termcolor import cprint from pyfiglet import figlet_format def word_len(word): word = word.strip() if len(word) <= 5: print("Not enough letters. Try again!") return None elif len(word) in (6,7,8): print("Your word is solid :)") elif len(word) in (9,10): print("Your word is amazing...") elif len(word) == 11: print("Your word really amaze me... :) + You're so close to kaboom!!!") elif len(word) == 12: cprint(figlet_format('KABOOM!!!', font='smkeyboard'), 'green', attrs=['bold']) else: print("U know rules? Try Again please!") return None # 校验通过的单词直接追加到内存中的列表 used_words_list.append(word) print(f"已记录单词,当前列表:{used_words_list}") return word word_len(input("Type your word: "))
注意:这个方案的修改只在当前程序运行周期内生效,重启程序后
used_words_list会回到usedDB.py中定义的初始值[""]。
方案2:持久化写入磁盘(程序重启后数据保留)
如果需要每次添加的单词永久保存,就要把更新后的列表写回usedDB.py文件。不推荐手动拼接Python代码字符串写文件,容易触发语法错误导致模块无法导入,这里用标准库ast安全解析和修改内容:
from usedDB import used_words_list from termcolor import cprint from pyfiglet import figlet_format import ast def save_word(new_word): # 读取磁盘上的usedDB.py文件内容 with open("usedDB.py", "r", encoding="utf-8") as f: file_content = f.read() # 安全解析原文件中的列表 list_def_part = file_content.split("used_words_list =", 1)[1].strip() original_list = ast.literal_eval(list_def_part) # 追加新词,可根据需求选择是否去重 if new_word not in original_list: original_list.append(new_word) # 把更新后的列表写回文件 with open("usedDB.py", "w", encoding="utf-8") as f: f.write(f"used_words_list = {repr(original_list)}") # 同步更新当前内存中的列表 used_words_list.clear() used_words_list.extend(original_list) def word_len(word): word = word.strip() if len(word) <= 5: print("Not enough letters. Try again!") return None elif len(word) in (6,7,8): print("Your word is solid :)") elif len(word) in (9,10): print("Your word is amazing...") elif len(word) == 11: print("Your word really amaze me... :) + You're so close to kaboom!!!") elif len(word) == 12: cprint(figlet_format('KABOOM!!!', font='smkeyboard'), 'green', attrs=['bold']) else: print("U know rules? Try Again please!") return None # 校验通过后持久化存储 save_word(word) return word word_len(input("Type your word: "))
更稳妥的持久化建议:动态变化的业务数据不要存在Python代码文件里,换成JSON、TXT或者轻量数据库存储更合适,读写逻辑更简单,也不会出现代码文件损坏的问题。
常见失败原因
- 对导入的
used_words_list做重新赋值操作(比如used_words_list = used_words_list + [word]),只会在当前作用域创建新变量,不会修改原列表对象 - 误以为内存修改会自动同步到磁盘,Python没有自动回写模块源文件的机制,所有磁盘修改都需要显式调用文件读写接口
- 手动拼接字符串写回py文件时没有处理特殊字符,导致
usedDB.py出现语法错误,后续导入直接失败 - 没有做输入合法性判断,把长度不符合要求的单词也存入了列表
内容的提问来源于stack exchange,提问作者Klemen Horvat-Novak
相关产品推荐
相关产品推荐

