函数内字典不更新(Python)

2024-04-24 15:56:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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)

我得到的结果是:

^{pr2}$

这就是我所期待的:

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('770201381089',8),我就会得到所需的值。在

任何帮助都是值得的。在

谢谢!在


Tags: csv函数代码fordatabyeanint
1条回答
网友
1楼 · 发布于 2024-04-24 15:56:49

字典是可变的

j = sum_data_by_month('7702010381089', 6) 
j is d # true

不创建新词典。。。它只是指向现有的字典

^{pr2}$

你可以通过

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)

现在

^{4}$

相关问题 更多 >