Все словари в списке меняют свои значения при изменении словаря - PullRequest
0 голосов
/ 26 июня 2018

Пожалуйста, помогите мне решить проблему.

Я создаю список.Тогда я добавляю к нему словари.У меня 2 одинаковых словаря в списке после добавления второго словаря и 3 одинаковых словаря в списке после добавления третьего словаря.

*** Settings ***
Library  Collections

*** Variables ***
&{test_dictionary}
@{positions_list}

*** Test Cases ***
Compaund list
    set to dictionary  ${test_dictionary}  Name=First Name  Length=50  db_name=f_name
    Append the dictionary to the list
    set to dictionary  ${test_dictionary}  Name=Last Name  Length=60  db_name=l_name
    Append the dictionary to the list
    set to dictionary  ${test_dictionary}  Name=Email Address  Length=40  db_name=email
    Append the dictionary to the list

*** Keywords ***
Append the dictionary to the list
    log dictionary  ${test_dictionary}
    append to list  ${positions_list}  ${test_dictionary}
    log list  ${positions_list}

Итак, у меня есть странный список после теста:

List length is 3 and it contains following items:
0: {'Name': 'Email Address', 'Length': '40', 'db_name': 'email'}
1: {'Name': 'Email Address', 'Length': '40', 'db_name': 'email'}
2: {'Name': 'Email Address', 'Length': '40', 'db_name': 'email'}

Почему первый и второй словари заменены?

1 Ответ

0 голосов
/ 26 июня 2018

Потому что в python переменная (грубо говоря) является указателем на область памяти;а словарь является изменяемым объектом - например, вы можете изменить значение в этой ячейке памяти.

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

Если вы хотите, чтобы в списке было 3 разных словаря - используйте3 переменные.

В качестве альтернативы, если вы этого не хотите, сохраните в списке копию словаря;будучи копией, она не изменится, если оригинал:

*** Settings ***
Library  Collections

*** Variables ***
&{test_dictionary}
@{positions_list}

*** Test Cases ***
Compaund list
    set to dictionary  ${test_dictionary}  Name=First Name  Length=50  db_name=f_name
    Append the dictionary to the list
    set to dictionary  ${test_dictionary}  Name=Last Name  Length=60  db_name=l_name
    Append the dictionary to the list
    set to dictionary  ${test_dictionary}  Name=Email Address  Length=40  db_name=email
    Append the dictionary to the list

*** Keywords ***
Append the dictionary to the list
    &{dict_copy}=    Copy Dictionary    ${test_dictionary}
    log dictionary  ${dict_copy}
    append to list  ${positions_list}  ${dict_copy}
    log list  ${positions_list}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...