Использование понимания списка Python для изменения самого списка, неожиданный результат? - PullRequest
0 голосов
/ 04 июля 2019

Я попытался внести изменения в каждый элемент в списке A на месте и у меня есть два метода: use_list_comprehension(A, length) и use_plain_loop(A, length).Они выполняют одну и ту же операцию над элементами, но дают разные результаты.

Мой вопрос таков: сначала для понимания списка Python создается копия A, а затем используется эта копия в качестве источника для получения элементов и выполнения операций над ними?

def arrange(A):
    length = len(A)
    A = use_list_comprehension(A, length) # we get [19, 20, 12, 1, 8]

    # A = use_plain_loop(A, length) # we get [19, 95, 12, 476, 2383]
    return A        


def use_list_comprehension(A, length):
    return [ A[i]+A[A[i]]*length for i in range(length) ]


def use_plain_loop(A, length):
    for i in range(length):
        A[i] += A[A[i]]*length
    return A


print(arrange([4,0,2,1,3]))

1 Ответ

2 голосов
/ 04 июля 2019

Нет, понимание списка не создает копию A, оно создает новый список, в котором значение, хранящееся в индексе i этого списка, равно A[i]+A[A[i]]*length. Таким образом, use_list_comprehension(A, length) возвращает новый список, а затем A устанавливается на этот новый список в строке 3. use_plain_loop(A, length), с другой стороны, фактически изменяет список на месте, так как A[i] += A[A[i]]*length заменяет значение, сохраненное в A[i] с A[i] + A[A[i]]*length.

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