Python: создание словаря: {int, объект класса} в цикле

#python-3.x

#python-3.x

Вопрос:

Я хотел бы создать dictonary: {int, Class} в цикле, однако объект класса переопределяется. Я почти уверен, что это основная проблема, но я застрял

 class Simple:
    simpleDic = {
        'name': {""},
        'age': {1}}

    def __init__(self, name, age):
        self.simpleDic['name'] = name
        self.simpleDic['age'] = age
    
    def __str__(self):
        return "{} {}n".format(self.simpleDic['name'], self.simpleDic['age'])

def foo():
    myDict = {}
    for x in range(3):
        myDict[x] = Simple('Name'   str(x), x)
        print(('{}: {}n'.format("Creating", myDict[x])))
    
    for key in myDict:
        print(('{}: {}n'.format("Printing"   str(key), myDict[key])))


#### Main program here ####

foo()
  

Результат выглядит следующим образом:

введите описание изображения здесь

Ответ №1:

Ваша проблема связана с последней печатью, которую вы печатаете myDict[x] , когда вы должны печатать myDict[key]

x содержит последнее значение из первой итерации, поэтому вы практически печатаете один и тот же ключ повсюду

Следуя вашему вопросу в этом комментарии:

 class Simple:

    def __init__(self, name, age):
        self.simpleDic = {"name": name, "age": age}
    
    def __str__(self):
        return "{} {}n".format(self.simpleDic['name'], self.simpleDic['age'])
    
    def __repr__(self):
        return "{} {}n".format(self.simpleDic['name'], self.simpleDic['age'])    

def foo():
    myDict = {}
    for x in range(3):
        myDict[x] = Simple('Name'   str(x), x)
        print(('{}: {}n'.format("Creating", myDict[x])))
        
    print(myDict)
  

Комментарии:

1. Боже мой, какая глупая ошибка. Я сожалею об этом.

2. Случается с лучшими из нас 🙂

3. А что, если я изменил код, о котором идет речь сейчас (заменил простую переменную словарем):

4. Тогда произойдет сбой, поскольку myDict принадлежит области действия foo функции, и вы получите NameError: name 'myDict' is not defined

5. Вы можете вернуть myDict значение в функции foo и присвоить его переменной в глобальной области видимости (перед вашим циклом)