首页 > 解决方案 > 字典更新 - 非常奇怪的行为

问题描述

在下面的代码中运行时,dict 显示出意外的行为

简而言之,我选择过去的日期并将信息添加到有关该日期的字典中。一切都很好,直到我在所有迭代后打印出结果字典:

功能代码,您可以将其 C/V 到您的 shell 中并使用 dictTester() 运行它:

from calendar import datetime as calendar_date
from datetime import datetime
def dictTester():
    breakdowns_dict = {}
    for row in range(2):
        temp_list = [row, None, None]
        while_true_counter = 0
        date_extracted = datetime.now() - calendar_date.timedelta(days=row)
        date_extracted = datetime.strptime(date_extracted.strftime('%Y-%m-%d'),'%Y-%m-%d')
        date_now = datetime.strptime(datetime.now().strftime('%Y-%m-%d'),'%Y-%m-%d')
        while True:
            if date_extracted > date_now:
                print('date > now')
                print('break')
                break
            if date_extracted == date_now:
                print('date == now')
                temp_list[1] = date_extracted.strftime('%Y-%m-%d')
                if while_true_counter > 0:
                    temp_list[2] = 'RIGHT'
                else:
                    temp_list[2] = 'PURE'
                print(temp_list)
            if date_extracted < date_now:
                print('date < now')
                temp_list[1] = date_extracted.strftime('%Y-%m-%d')
                if while_true_counter > 0:
                    temp_list[2] = 'MIDDLE'
                else:
                    temp_list[2] = 'LEFT'
                print(temp_list)
            if date_extracted not in breakdowns_dict:
                breakdowns_dict[date_extracted] = {}
                print('created entry')
            else:
                print('updated entry')
            print(date_extracted)
            print(len(breakdowns_dict[date_extracted]))
            breakdowns_dict[date_extracted][len(breakdowns_dict[date_extracted])] = temp_list
            print(breakdowns_dict[date_extracted][len(breakdowns_dict[date_extracted])-1])
            # next iteration
            date_extracted += calendar_date.timedelta(days=1)
            while_true_counter += 1    
    for bd_date in breakdowns_dict:
        for bd_entry in breakdowns_dict[bd_date]:
            print(bd_date.strftime('%Y-%m-%d'), breakdowns_dict[bd_date][bd_entry])

蟒蛇外壳输出

$ date == now     
$ [0, '2021-03-18', 'PURE']     
$ created entry '2021-03-18' 0 = [0, '2021-03-18', 'PURE']    
$ date > now     
$ break     
$ date < now     
$ created entry 2021-03-17 0 = [1, '2021-03-17', 'LEFT']     
$ date == now    
$ updated entry '2021-03-18' 1 = [1,'2021-03-18', 'RIGHT']     
$ date > now break

所以你会期望结果字典是:

$ '2021-03-18' 0 = [0, '2021-03-18', 'PURE']
$ '2021-03-18' 1 = [1,'2021-03-18', 'RIGHT']
$ '2021-03-17' 0 = [1, '2021-03-17', 'LEFT']

但相反,它打印:

$ '2021-03-18' [0, '2021-03-18', 'PURE'] 
$ '2021-03-18' [1, '2021-03-18', 'RIGHT'] 
$ '2021-03-17' [1, '2021-03-18', 'RIGHT'] 

当增加行值时,您可以看到更多这种时髦的行为

对于 3,你应该得到一个 'PURE' 一个 'LEFT'-'RIGHT' 和一个 'LEFT'-'MIDDLE'-'RIGHT' 等等,你明白了

但这将无视对手。

标签: python

解决方案


简单的错误是按引用传递与按值传递错误,我很傻

在这里回答:python 按值列出而不是按引用

更新代码行:

breakdowns_dict[date_extracted][len(breakdowns_dict[date_extracted])] = temp_list

breakdowns_dict[date_extracted][len(breakdowns_dict[date_extracted])] = temp_list[:]

这就是我们所需要的一切


推荐阅读