Python字典值替换问题:修改后变量值未更新如何解决?
问题:修改变量值后打印结果未更新的问题分析与解决
我尝试通过用户输入将变量的旧值替换为新值,运行代码后发现,例如修改Alamat的值时,输入新值2并确认替换后,打印的After call结果中Alamat的值仍为7,与预期的2不符。请问代码哪里出错了,该如何解决这个问题?
原代码如下:
class test(): id = "tes" pwd = "1" role = "2" nama = "3" nip = "4" tl = "5" nomorhp = "6" alamat = "7" databaru = "" pilihan = "" obj = test() id = "tes" pwd = "1" role = "2" nama = "3" nip = "4" tl = "5" nomorhp = "6" alamat = "7" databaru = "" pilihan = "" jenisData = { "Username": id, "Password": pwd, "Role": role, "Nama Lengkap": nama, "NIP": nip, "Tanggal Lahir": tl, "Nomor HP": nomorhp, "Alamat": alamat } print(f"di merhod admin Username : {id}\nPassword : {pwd}\nRole : {role}\nNama Lengkap : {nama}\nNIP : {nip}\nTanggal Lahir : {tl}\nNomor HP : {nomorhp}\nAlamat : {alamat}") while True: editData = input("Data apa yang ingin diganti?: ") if editData in jenisData: datalama = jenisData[editData] databaru = input("Masukkan data yang baru: ") pilihan = input(f"Data {datalama} akan diganti ke {databaru}, anda yakin ingin menggantinya (Y/T)? ") print(f"\nBefore call\nUsername : {id}\nPassword : {pwd}\nRole : {role}\nNama Lengkap : {nama}\nNIP : {nip}\nTanggal Lahir : {tl}\nNomor HP : {nomorhp}\nAlamat : {alamat}") while True: if pilihan == "Y" or pilihan == "y": jenisData[editData] = databaru setattr(obj, editData, databaru) print(f"\nAfter call\nUsername : {id}\nPassword : {pwd}\nRole : {role}\nNama Lengkap : {nama}\nNIP : {nip}\nTanggal Lahir : {tl}\nNomor HP : {nomorhp}\nAlamat : {alamat}") print("Ada lagi data yang ingin diganti?") break
错误原因分析
- 多数据源不一致:你同时维护了三类数据:全局变量(
id、alamat等)、类test的实例属性、字典jenisData。但修改操作只更新了字典和类实例属性,全局变量本身从未被修改,而打印语句输出的是全局变量的值,所以结果不会变化。 - 字典初始化的是值而非引用:字符串是Python的不可变类型,字典
jenisData初始化时存储的是全局变量当时的字符串值,后续修改字典或全局变量,两者不会互相同步。 - 逻辑冗余且混乱:同时维护多份相同数据,不仅容易出错,还增加了代码复杂度。
解决方法
核心思路是只维护单一数据源,所有操作和打印都基于这个数据源,避免数据不同步。下面提供两种规范的修改方案:
方案一:以类实例为唯一数据源
用类实例存储所有数据,操作和打印都直接访问实例属性:
class test(): def __init__(self): self.id = "tes" self.pwd = "1" self.role = "2" self.nama = "3" self.nip = "4" self.tl = "5" self.nomorhp = "6" self.alamat = "7" obj = test() # 映射显示名称到实例属性名 jenisData_map = { "Username": "id", "Password": "pwd", "Role": "role", "Nama Lengkap": "nama", "NIP": "nip", "Tanggal Lahir": "tl", "Nomor HP": "nomorhp", "Alamat": "alamat" } # 定义打印函数,避免重复代码 def print_data(obj): print(f"Username : {obj.id}\nPassword : {obj.pwd}\nRole : {obj.role}\nNama Lengkap : {obj.nama}\nNIP : {obj.nip}\nTanggal Lahir : {obj.tl}\nNomor HP : {obj.nomorhp}\nAlamat : {obj.alamat}") print("di merhod admin") print_data(obj) while True: editData = input("\nData apa yang ingin diganti?: ") if editData not in jenisData_map: print("Data tidak ditemukan!") continue attr_name = jenisData_map[editData] datalama = getattr(obj, attr_name) databaru = input("Masukkan data yang baru: ") pilihan = input(f"Data {datalama} akan diganti ke {databaru}, anda yakin ingin menggantinya (Y/T)? ") print("\nBefore call") print_data(obj) if pilihan.lower() == "y": setattr(obj, attr_name, databaru) print("\nAfter call") print_data(obj) lagi = input("\nAda lagi data yang ingin diganti? (Y/T): ") if lagi.lower() != "y": break
方案二:以字典为唯一数据源
如果不需要类实例,可以直接用字典存储所有数据,打印时从字典取值:
jenisData = { "Username": "tes", "Password": "1", "Role": "2", "Nama Lengkap": "3", "NIP": "4", "Tanggal Lahir": "5", "Nomor HP": "6", "Alamat": "7" } def print_data(data): for key, value in data.items(): print(f"{key} : {value}") print("di merhod admin") print_data(jenisData) while True: editData = input("\nData apa yang ingin diganti?: ") if editData not in jenisData: print("Data tidak ditemukan!") continue datalama = jenisData[editData] databaru = input("Masukkan data yang baru: ") pilihan = input(f"Data {datalama} akan diganti ke {databaru}, anda yakin ingin menggantinya (Y/T)? ") print("\nBefore call") print_data(jenisData) if pilihan.lower() == "y": jenisData[editData] = databaru print("\nAfter call") print_data(jenisData) lagi = input("\nAda lagi data yang ingin diganti? (Y/T): ") if lagi.lower() != "y": break
内容的提问来源于stack exchange,提问作者user512512af
相关产品推荐
相关产品推荐

