Это потому, что dict.fromkeys(['pa', 'iou', 'dice'], 0)
вызывается ровно один раз, а не один раз для каждого ключа в acc
.
>>> acc['train'] is acc['val']
True
Словари - это один и тот же объект в памяти, у вас есть только два способа получить к нему доступ - через acc['train']
и acc['val']
.
Вы можете использовать defaultdict
с функцией, которая создает новый словарь по требованию:
>>> from collections import defaultdict
>>> d = defaultdict(lambda: {'pa': 0, 'iou': 0, 'dice': 0})
>>> d['train']
{'pa': 0, 'iou': 0, 'dice': 0}
>>> d['val']
{'pa': 0, 'iou': 0, 'dice': 0}
>>> d['train']['pa'] = 1
>>> d['train']
{'pa': 1, 'iou': 0, 'dice': 0}
>>> d['val']
{'pa': 0, 'iou': 0, 'dice': 0}
Однако имейте в виду, что это создает Новый словарь каждый раз, когда вы получаете доступ к новому ключу:
>>> d['foo']
{'pa': 0, 'iou': 0, 'dice': 0}
Если вы не хотите этого, создайте словарь для каждого ключа вручную с пониманием dict:
>>> keys = ['train', 'val']
>>> d = {k:{'pa': 0, 'iou': 0, 'dice': 0} for k in keys}
>>> d['train']['pa'] = 1
>>> d['train']
{'pa': 1, 'iou': 0, 'dice': 0}
>>> d['val']
{'pa': 0, 'iou': 0, 'dice': 0}