Python循环中字典值被覆盖求助:pymysql读取MySQL数据异常
问题分析与解决方案
嘿,这个问题我之前也踩过坑!核心原因其实是DictCursor返回的行对象是同一个字典的引用——每次循环迭代时,它只是把当前行的数据更新到这个字典里,而不是生成一个全新的字典。如果你直接把这个行对象添加到列表里,列表里的所有元素最终都会指向同一个字典,自然最后显示的全是最后一行的数据。
举个你可能正在用的错误代码例子:
import pymysql.cursors # 连接数据库 conn = pymysql.connect( host="你的主机", user="用户名", password="密码", db="数据库名", cursorclass=pymysql.cursors.DictCursor ) data = [] try: with conn.cursor() as cursor: cursor.execute("SELECT * FROM your_table") for row in cursor: print(row) # 这里打印的是当前循环的正确数据 data.append(row) # 错误:直接添加同一个字典引用 print(data) # 这里会看到两个元素都是最后一行的数据 finally: conn.close()
解决方法很简单,每次循环时复制行对象的内容到新字典里:
有几种常用的方式:
- 使用字典的
copy()方法(浅拷贝,适合没有嵌套结构的行数据):
data.append(row.copy())
- 用
dict()构造函数重新生成字典:
data.append(dict(row))
- 如果你的行数据里有嵌套的字典或列表,需要用深拷贝(导入
copy模块):
import copy data.append(copy.deepcopy(row))
这样修改后,列表里的每个元素都是独立的字典对象,不会被后续循环的内容覆盖,最后print(data)就能看到两条正确的不同数据啦!
内容的提问来源于stack exchange,提问作者user3605780
相关产品推荐
相关产品推荐

