python - 字典更新 - 非常奇怪的行为
问题描述
在下面的代码中运行时,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 按值列出而不是按引用
更新代码行:
breakdowns_dict[date_extracted][len(breakdowns_dict[date_extracted])] = temp_list
至
breakdowns_dict[date_extracted][len(breakdowns_dict[date_extracted])] = temp_list[:]
这就是我们所需要的一切
推荐阅读
- java - 如何使用 setter 和 getter 方法获取对象的对象数组及其响应
- oauth-2.0 - google action 帐号关联 帐号关联失败
- javascript - 如何在渲染之前计算将在ui元素中渲染的字符数
- reactive-programming - 如果 X 秒后可观察对象没有发出任何内容,如何执行操作?
- reactjs - 如何从材料表中删除覆盖装载机?
- java - 如何在 GetLogger 中获取类名并在 log4j 2 中打印正确的类名
- c# - 我应该为文件传输场景选择哪个服务器端应用程序
- xamarin - ImageCell 仅在 Android 上不显示图像
- python - 是否有在模拟函数中调用方法的选项?
- c# - C#:如果有多个具有默认值的参数,在使用函数时如何跳过以前的参数