python 字典的值在for循环中被莫名其妙修改,被非预期的修改,--更新一个字典key的值,另一个字典key也被更新

发布时间 2023-08-19 23:56:46作者: zhangmingda

注意:python中用变量作为一个字典的key/value, 存储的是变量的内存地址。

 

# 测试两个字典使用相同的列表内容做值,值的内存地址是不同的,修改一个字典的某个key的值,另一个字典不受影响
webhook_bind_company = {}
phones_bind_company_name = {}
for i in range(3):
    company_str_list = ['智者四海']
    if "url1" not in webhook_bind_company:
        webhook_bind_company["url1"] = ['智者四海']
    else:
        webhook_bind_company["url1"].extend(['智者四海'])
    if "13263190002" not in phones_bind_company_name:
        phones_bind_company_name["1234567890"] = ['智者四海']
    elif i == 3 :
        phones_bind_company_name["1234567890"].extend(['智者四海'])
    print("webhook_bind_company:", webhook_bind_company)
    print("phones_bind_company_name:", phones_bind_company_name)
print("ID:", id(phones_bind_company_name["1234567890"]))   #  内存地址不同
print("ID:", id(webhook_bind_company["url1"]))              #  内存地址不同
# 输出:
# webhook_bind_company: {'url1': ['智者四海']}
# phones_bind_company_name: {'1234567890': ['智者四海']}
# webhook_bind_company: {'url1': ['智者四海', '智者四海']}
# phones_bind_company_name: {'1234567890': ['智者四海']}
# webhook_bind_company: {'url1': ['智者四海', '智者四海', '智者四海']}
# phones_bind_company_name: {'1234567890': ['智者四海']}
# ID: 2031893501184
# ID: 2031893310848

print("分割线".center(30, "*"))


webhook_bind_company = {}
phones_bind_company_name = {}
# 使用同一个变量作为两个字典的key的值,一个字典中key值被修改,则另一个字典中的也被修改了。
for i in range(3):
    company_str_list = ['智者四海']  # 循环第一次时被当做内存地址传入
    if "url1" not in webhook_bind_company:
        webhook_bind_company["url1"] = company_str_list
    else:
        webhook_bind_company["url1"].extend(company_str_list)  # 对key的原值直接更改
    if "1234567890" not in phones_bind_company_name:
        phones_bind_company_name["1234567890"] = company_str_list    # 第二个字典中的值也被更改, 因为指向同一个列表的内存地址。
    elif i == 3 :
        phones_bind_company_name["1234567890"].extend(company_str_list)
    print("company_str_list: ", company_str_list,"ID:", id(company_str_list))
    print("webhook_bind_company:", webhook_bind_company)
    print("phones_bind_company_name:", phones_bind_company_name)
    # 使用变量传递值,为内存地址,一个字典值修改,领个字典值同样被修改
print(" company_str_list ID:", id(company_str_list))   
print("ID:", id(phones_bind_company_name["1234567890"]))   #  内存地址相同
print("ID:", id(webhook_bind_company["url1"]))              #  内存地址相同
# 输出:
# *************分割线**************
# company_str_list:  ['智者四海'] ID: 1743997326528
# webhook_bind_company: {'url1': ['智者四海']}
# phones_bind_company_name: {'1234567890': ['智者四海']}
# company_str_list:  ['智者四海'] ID: 1743997898048
# webhook_bind_company: {'url1': ['智者四海', '智者四海']}
# phones_bind_company_name: {'1234567890': ['智者四海', '智者四海']}
# company_str_list:  ['智者四海'] ID: 1743997136192
# webhook_bind_company: {'url1': ['智者四海', '智者四海', '智者四海']}
# phones_bind_company_name: {'1234567890': ['智者四海', '智者四海', '智者四海']}
#  company_str_list ID: 1743997136192
# ID: 1743997326528
# ID: 1743997326528