Значение словаря для всех ключей удаляется автоматически - PullRequest
0 голосов
/ 12 мая 2018

Код

 def fill_dictionary_with_valid_addr_row_data( df ):

        data_list = []
        dictionary = {}
        int_endianness = 0

        for i in df.index:
            addrstr = str(df['Address'][i])

            if (addrstr != 'nan'):

                try:
                    addr = int(addrstr, 16)

                except:
                    print("Address in excel is not in hex format : %s", addrstr)
                    sys.exit()

                width = int(df['Width'][i])
                width = int(width / 8);

                endianess = df['Endianess'][i]
                if (endianess != 'B') and (endianess != 'L'):
                    print("ERROR: Register endianess is not B or L");
                    print("Register : %x, Endianess : %s" % (addr, endianess))
                    sys.exit()

                if endianess == 'B':
                    int_endianness = 1

                data_list.append(addr)
                data_list.append(width)
                data_list.append(int_endianness)

                dictionary[i] = data_list
                print(dictionary)

                data_list.clear()

        print(dictionary)

        return dictionary

Задача

Когда я печатаю словарь внутри цикла, все в порядке. Когда я печатаю словарь снаружи для цикла, все значения (списки) пусты.

Ниже приведены журналы

{0: [22216704, 4, 1]}
{0: [22216716, 4, 1], 5: [22216716, 4, 1]}
{0: [22216720, 4, 1], 5: [22216720, 4, 1], 7: [22216720, 4, 1]}
{0: [], 5: [], 38: [], 7: []}

Я начинающий программист на Python. Я пытался много искать через Интернет, но я не нашел никакого решения.

Есть какие-нибудь подсказки?

1 Ответ

0 голосов
/ 12 мая 2018

Всякий раз, когда вы делаете dictionary[i] = data_list, вы фактически назначаете ссылку на список в словарную статью. Рассмотрим следующий пример:

>>> l = [1,2,3]
>>> d = {}
>>> d["a"] = l
>>> d["b"] = l
>>> d
{'a': [1, 2, 3], 'b': [1, 2, 3]}
>>> l.clear()
>>> d
{'a': [], 'b': []}

Как видите, изменение l отражено во всех значениях словаря. Каждый раз, когда вы выводите на печать, один и тот же список назначается одной, двум или трем словарным статьям соответственно. Поскольку значения всегда одни и те же, похоже, что вы каждый раз добавляете разные списки, но это не так.

Что вы действительно хотите сделать, это создать новый список для каждой итерации цикла:

for i in df.index:
    ...

    data_list = []
    data_list.append(addr)
    data_list.append(width)
    data_list.append(int_endianness)
    dictionary[i] = data_list

или короче:

dictionary[i] = [addr, width, int_endianness]

Использование этого кода data_list будет содержать новый список на каждой итерации, без связи с ранее определенными списками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...