В python вы не можете создать local переменные во время выполнения. Вы должны явно присвоить им значение.
Что-то вроде этого:
locals()['lloyd'] = {...}
locals()['alice'] = {...}
locals()['tyler'] = {...}
делает не создать локальные переменныеlloyd
, alice
и tyler
:
>>> def some_function():
... locals()['lloyd'] = {}
... print lloyd
...
>>> some_function()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in some_function
NameError: global name 'lloyd' is not defined
Цитирование из документации для locals()
:
Примечание Содержание этого словаря не должно изменяться; изменения могут не влиять на значения локальных и свободных переменных, используемые интерпретатором.
Что вы можете сделать, это создать глобальные переменные во время выполнения, используя словарь, возвращенное globals()
. Хотя я не понимаю, почему вы должны сделать что-то подобное.
Однако вы можете использовать copy
модуль, чтобы избежать повторений dict
определения:
import copy
base_dict = {"homework": [], "quizzes": [], "tests": []}
lloyd = copy.deepcopy(base_dict)
alice = copy.deepcopy(base_dict)
tyler = copy.deepcopy(base_dict)
for the_dict, name in ((lloyd, "lloyd"), (alice, "alice"), (tyler, "tyler")):
the_dict["name"] = name.capitalize()
Или без петли:
import copy
base_dict = {"homework": [], "quizzes": [], "tests": []}
lloyd = copy.deepcopy(base_dict)
alice = copy.deepcopy(base_dict)
tyler = copy.deepcopy(base_dict)
lloyd["name"], alice["name"], tyler["name"] = "lloyd", "alice", "tyler"
В зависимости от того, что вы хотите сделать с помощью defaultdict
может быть хорошая идея:
from collections import defaultdict
lloyd = defaultdict(list)
alice = defaultdict(list)
tyler = defaultdict(list)
lloyd["name"], alice["name"], tyler["name"] = "lloyd", "alice", "tyler"
defaultdict
, вместо того, чтобы поднимать KeyError
, когда ключ не найден, он создает значение по умолчанию (в этом случае пустое list
) и устанавливает это значение как значение ключа, поэтому вам не нужно указывать "tests": []
.
В зависимости от ваших потребностей и предпочтений вы также можете создать новый класс для представления студентов с атрибутами «имя», «домашнее задание» и т. Д., А также методы/функции для работы с этой информацией. Но словари прекрасны, поэтому нет недовольства там, пока у ваших учеников есть уникальные имена :) – mdscruggs
* Почему вы импортируете 'string'? Функции в этом модуле были в основном устаревшими в * python 1.6 * или что-то в этом роде. Вместо этого вы должны использовать методы строковых объектов. – Bakuriu