我是stackoverflow的新手,也是Python的新手。我已经尝试了几天才能让这个工作起来,但是我不太明白我做错了什么,我也经常搜索一个常见的问题,但没有运气。
以下代码从csv文件中读取一些销售数据,然后返回包含两个键(唯一代码和年份值)的字典以及特定月份的销售总和。我将两个参数传递给函数,代码和月份。那部分正在做我想要的事情,当我想要通过不同月份迭代时问题就出现了,无论我分配给函数的是什么值(月份),它总是会返回我分析的第一个值
d = defaultdict(int)
spamReader = csv.reader(open('C:\Sales\Sales_CO05.csv', 'rU'))
#Return the sales sum for a given month and code
def sum_data_by_month(ean, m):
for line in spamReader:
tokens = [t for t in line]
if tokens[5] == str(ean):
try:
sid = tokens[5]
dusid = tokens[18]
value = int(str(tokens[m]).replace(',',''))
except ValueError:
continue
d[sid,dusid] += value
return d
#Try to iterate over different month values
j = sum_data_by_month('7702010381089', 6)
f = sum_data_by_month('7702010381089', 7)
m = sum_data_by_month('7702010381089', 8)
a = sum_data_by_month('7702010381089', 9)
这是我得到的结果:
defaultdict(<type 'int'>, {('7702010381089', '2013'): 80, ('7702010381089', '2014'): 363})
defaultdict(<type 'int'>, {('7702010381089', '2013'): 80, ('7702010381089', '2014'): 363})
defaultdict(<type 'int'>, {('7702010381089', '2013'): 80, ('7702010381089', '2014'): 363})
defaultdict(<type 'int'>, {('7702010381089', '2013'): 80, ('7702010381089', '2014'): 363})
这就是我所期待的:
defaultdict(<type 'int'>, {('7702010381089', '2013'): 80, ('7702010381089', '2014'): 363})
defaultdict(<type 'int'>, {('7702010381089', '2013'): 229, ('7702010381089', '2014'): 299})
etc..
看起来如果dict被卡在某种内存状态中,那就是不允许它更新,如果我运行一个函数的单个实例(即j = sum_data_by_month('7702010381089',8)II get de期望值。
任何帮助都会非常苛刻。
谢谢!
答案 0 :(得分:1)
字典是可变的
j = sum_data_by_month('7702010381089', 6)
j is d # true
不创建新词典......它只是指向现有词典
f = sum_data_by_month('7702010381089', 7) #the dictionary has changed
f is j # true , both point to the same dictionary
f is d # true , both point to d to be specific
您可以通过
修复它from copy import deepcopy
...
def sum_data_by_month(ean, m):
...
return deepcopy(d) # a new dict no longer just a pointer to the same d
#or maybe even better
return dict(d)
现在
j = sum_data_by_month('7702010381089', 6)
j is d # false