Значение в списке изменилось после прохождения цикла - PullRequest
0 голосов
/ 13 декабря 2018

Недавно я очищал некоторые данные, и меня поразила только одна вещь.Простой пример:

test_list1 = [[1,2,3,4,5], [1,2,3,4,5]]

for x in test_list1:
    for y in range(0, len(x)):
        x[y] = 0

print(test_list1)

-> [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

Однако, если я попробую следующее, я получу другой результат:

test_list2 = [1,2,3,4,5]

for x in test_list2:
    x = 0

print(test_list2)

-> [1, 2, 3, 4, 5]

Мне кажется довольно странным, что в test_list1 я смог изменитьзначения в его подсписках без фактической ссылки на test_list1.Почему значения в test_list1 изменились только при запуске цикла, если я не указал явно, что test_list1 [0] [0] = 0 и так далее?В test_list2 это было невозможно.

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Ваш вопрос может быть упрощен до этого:

a = 0
b = a
b = 1
print(a, b) # >> 0 1

a = [0,0]
b = a
b[0] = 1
print(a, b) # >> [1, 0] [1, 0]

Это потому, что когда вы делаете b = a с числами, b является копией a, так что вы можете редактировать их отдельно.Но когда вы делаете это со списком, две переменные соответствуют одному и тому же объекту.В основном это делается для повышения эффективности (копирование списка каждый раз, когда вы делаете что-то вроде a = b, было бы очень неэффективно и часто бесполезно).Таким образом, когда вы редактируете один, другой затрагивается.

В for x in test_list2:, x является копией элемента test_list2.Но в for x in test_list1:, x напрямую соответствуют элементу (списку) test_list2.

. Более подробно вы можете прочитать эту статью об изменяемых объектах .

0 голосов
/ 13 декабря 2018

Суть в том, что в вашем первом цикле каждый экземпляр x является списком.Во втором цикле каждый экземпляр x является целым числом.В Python списки изменчивы, а целые неизменны.Если вы выполните поиск в Интернете по запросу «python mutable vs immutable», вы можете найти несколько страниц, на которых описано, в чем заключается различие и почему оно приводит к таким результатам.

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