Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我的字典值在循环后会发生变化?_Python_Dictionary - Fatal编程技术网

Python 为什么我的字典值在循环后会发生变化?

Python 为什么我的字典值在循环后会发生变化?,python,dictionary,Python,Dictionary,以下是我的python代码: from collections import defaultdict data = {"Manoj":{"India":{"Airtel":2000,"Vodafone":5000},"Pakistan":{"Airtel":3000}}, "Shafiq":{"Pakistan":{"Airtel":5000,"BP":10000}}, "Shams":{"India":{"BP":400}}, "Govind":{"India":{"A

以下是我的python代码:

from collections import defaultdict
data = {"Manoj":{"India":{"Airtel":2000,"Vodafone":5000},"Pakistan":{"Airtel":3000}},
    "Shafiq":{"Pakistan":{"Airtel":5000,"BP":10000}},
    "Shams":{"India":{"BP":400}},
    "Govind":{"India":{"Airtel":3000,"Vodafone":2000}},
    "Zakir":{"SriLanka":{"Etisalat":7000}}
    }

print("Printing data:")
print(data)
sumOperator={}
countryCustomers = defaultdict(list)

sum=0

for name,value in data.items():
    for country,value2 in value.items():
        countryCustomers[country].append(name)
        if country not in sumOperator:
            sumOperator[country]=value2
        else:
            for operator,value3 in value2.items():
                if operator not in sumOperator[country]:
                    sumOperator[country][operator] = value3
                else:
                    sum = sumOperator[country][operator] + value3
                    sumOperator[country][operator] = sum

print("")
print("Printing sumOperator:")
print(sumOperator)
print("")
print("Priniting data:")
print(data)

Output:
Printing data:
{'Zakir': {'SriLanka': {'Etisalat': 7000}}, 'Manoj': {'Pakistan': {'Airtel':3000}, 'India': {'Vodafone': 5000, 'Airtel': 2000}}, 'Shams': {'India': {'BP': 400}}, 'Shafiq': {'Pakistan': {'BP': 10000, 'Airtel': 5000}}, 'Govind': {'India': {'Vodafone': 2000, 'Airtel': 3000}}}

Printing sumOperator:
{'Pakistan': {'BP': 10000, 'Airtel': 8000}, 'SriLanka': {'Etisalat': 7000}, 'India': {'Vodafone': 7000, 'BP': 400, 'Airtel': 5000}}

Priniting data:
{'Zakir': {'SriLanka': {'Etisalat': 7000}}, 'Manoj': {'Pakistan': {'BP': 10000, 'Airtel': 8000}, 'India': {'Vodafone': 7000, 'BP': 400, 'Airtel': 5000}}, 'Shams': {'India': {'BP': 400}}, 'Shafiq': {'Pakistan': {'BP': 10000, 'Airtel': 5000}}, 'Govind': {'India': {'Vodafone': 2000, 'Airtel': 3000}}}

为什么我的字典“数据”在初始化另一个字典后会更改值?最后一个print data语句生成另一个数据字典,它与在开始时初始化的数据字典不同

当程序向sumOperator字典添加值时会出现问题,主要是循环中的最后一个
else
语句。您正试图从另一个字典的值构建此字典,因此您有
summoperator[key]=value
,其中
value
引用另一个字典中的项。这只是将一本字典指向另一本字典的值;未复制基础值。因此,当您更新sumOperator的值时,主数据字典也会更新。要解决此问题,只需在将值添加到新字典时复制这些值

以下代码有效,只要在更新sumOperator时添加
copy()

正如其他人所指出的,您可能希望在上查看Python文档页面。如果您不想修改原件,请务必记住何时需要创建显式副本。

@Manjo对我来说似乎是一种挑战
from collections import defaultdict
from copy import copy
data = {"Manoj":{"India":{"Airtel":2000,"Vodafone":5000},"Pakistan":{"Airtel":3000}},
        "Shafiq":{"Pakistan":{"Airtel":5000,"BP":10000}},
        "Shams":{"India":{"BP":400}},
        "Govind":{"India":{"Airtel":3000,"Vodafone":2000}},
        "Zakir":{"SriLanka":{"Etisalat":7000}}
        }

print("Printing data:")
print(data)

sumOperator={}
countryCustomers = defaultdict(list)

sum=0

for name,value in data.items():
    for country,value2 in value.items():
        countryCustomers[country].append(name)
        if country not in sumOperator:
            sumOperator[country] = copy(value2)
        else:
            for operator,value3 in value2.items():
                if operator not in sumOperator[country]:
                    sumOperator[country][operator] = copy(value3)
                else:
                    sum = sumOperator[country][operator] + copy(value3)
                    sumOperator[country][operator] = sum


print("Printing sumOperator:")
print(sumOperator)

print("Priniting data:")
print(data)