首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数组数据在功能之外的变化

数组数据在功能之外的变化
EN

Stack Overflow用户
提问于 2014-06-25 21:41:50
回答 1查看 38关注 0票数 0

我正在编写一个函数,用于获取每年购买的软件许可证&返回每个月花费的金额。所以投入。

代码语言:javascript
复制
#[company id, user id, purchase amount, date in yy-mm format, day when customer first registered]
['55463', '114769', $200, '14-5', '2/14/2013']

会回来

代码语言:javascript
复制
['55463', '114769', $17.5, '14-5', '2/14/2013']
['55463', '114769', $17.5, '14-6', '2/14/2013']
['55463', '114769', $17.5, '14-7', '2/14/2013']
['55463', '114769', $17.5, '14-8', '2/14/2013']

等等,我有一个函数,可以按需要打印出来。但是,当我试图访问函数外部的数据时,我写入的数组在上个月突然显示了多次重复。所以最后一个例子就是。

代码语言:javascript
复制
['55463', '114769', $17.5, '14-8', '2/14/2013']
['55463', '114769', $17.5, '14-8', '2/14/2013']
['55463', '114769', $17.5, '14-8', '2/14/2013']
['55463', '114769', $17.5, '14-8', '2/14/2013']

我不知道这是为了我的生命&我会非常感谢任何帮助。这是我的密码。我相信错误在for循环中的某个位置,在范围(11)中的x开始。谢谢你的帮助!

代码语言:javascript
复制
line_items = []
annualized = []
def csv_dict_reader(file_obj):
global board_info 
reader = csv.DictReader(file_obj, delimiter=',')
for line in reader:
    item = []
    item.append(line["company id"])
    item.append(line["user id"])
    item.append(line["Amount"])
    item.append(line["Transaction Date"])
    item.append(line["FIrst Transaction"])
    line_items.append(item)
if __name__ == "__main__":
with open("ChurnTest.csv") as f_obj:
    csv_dict_reader(f_obj)

def dateSplit():
for i in range(1,4192):
    line = line_items[i]
    amount = line_items[i][2]
    if len(amount) > 1 and line_items[i][1] == '114769':
        if float(amount) > 150:
                line_items[i][2] = float(amount) / 12
                #monthly_transactions.append(line_items[i])
                year = int(line[3][:2])
                month = int(line[3][4:])
                for x in range(11):
                    month = int(month)            
                    year = int(year)
                    newLine = line_items[i]
                    if month > 11:
                        year = year + 1
                        month = 1
                    else:
                        month = month + 1
                    newLine[3] = str(year) + "-" + str(month)
                    annualized.append(newLine)
                    #This prints out the data as I want it to be
                    print(annualized[len(annualized)-1])
        else:
            monthly_transactions.append(line_items[i])

dateSplit()
#This prints out the data incorrectly.
print(annualized)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-25 21:51:47

关于错误的来源,您是正确的,它在循环for x in range(11):中。这一行:

代码语言:javascript
复制
 newLine = line_items[i]

创建一个新对象。Python列表是可变的,所以即使您编辑了它,newLine仍然引用annualizedline_items中相同的对象。最小的解决办法是:

代码语言:javascript
复制
newLine = line_items[i][:] # or 'line[:]' - see below

这使得newLine在每个循环中都是一个单独的副本。

有关名称和参考的更多信息,您可能应该阅读

为什么分配line然后继续引用line_items[i]?而且,硬代码4192看起来真的很奇怪;您可以不做for line in line_items[1:]:吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24419091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档