You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

错误原因分析

  1. 多数据源不一致:你同时维护了三类数据:全局变量(id、alamat等)、类test的实例属性、字典jenisData。但修改操作只更新了字典和类实例属性,全局变量本身从未被修改,而打印语句输出的是全局变量的值,所以结果不会变化。
  2. 字典初始化的是值而非引用:字符串是Python的不可变类型,字典jenisData初始化时存储的是全局变量当时的字符串值,后续修改字典或全局变量,两者不会互相同步。
  3. 逻辑冗余且混乱:同时维护多份相同数据,不仅容易出错,还增加了代码复杂度。

解决方法

核心思路是只维护单一数据源,所有操作和打印都基于这个数据源,避免数据不同步。下面提供两种规范的修改方案:

方案一:以类实例为唯一数据源

用类实例存储所有数据,操作和打印都直接访问实例属性:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 13:20:36