Почему изменения списка внутри функции не изменяют список? - PullRequest
0 голосов
/ 26 сентября 2019

Я пишу программу для удаления дублированных элементов из данного отсортированного списка.Я написал функцию «removeDuplicates» для внесения некоторых изменений в список и печати обновленного списка в конце функции.Поскольку список передается по ссылке, вопрос заключается в том, почему изменения не применяются к списку вне функции.

def removeDuplicates(nums):
    c = 0
    nums = nums + [nums[-1] + 1]  # add a dummy element to the end of the list
    for i in range(len(nums) - 1):
        if nums[i] != nums[i + 1]:
            nums[c] = nums[i]
            c = c + 1
    nums.pop()
    print(nums)

if __name__ == "__main__":
    nums = [1, 1, 1, 2, 2, 3, 4, 4, 4, 5, 5]
    removeDuplicates(nums)
    print(nums)

Ответы [ 4 ]

3 голосов
/ 26 сентября 2019

Ваша проблема в строке:

nums = nums + [nums[-1] + 1]

, потому что вы переназначаете числа на новое значение.Вместо этого попробуйте:

nums.append(nums[-1] + 1)

Таким образом, вы меняете значение nums вместо , что означает, что вы по-прежнему ссылаетесь на один и тот же объект во всей функции, а не насоздание нового объекта.

2 голосов
/ 26 сентября 2019
nums = nums + [nums[-1] + 1]  # add a dummy element to the end of the list

Неверно.Вы специально создаете новый список из nums и вашего нового элемента, а затем задаете локальную переменную nums, указывающую на этот новый список.Затем вы работаете с новым списком и выходите из функции без сохранения результата.

Попробуйте

nums.append(nums[-1] + 1)  # add a dummy element to the end of the list

Вывод:

[1, 2, 3, 4, 5, 3, 4, 4, 4, 5, 5]
0 голосов
/ 26 сентября 2019

Как уже упоминалось в других ответах, проблема заключается в добавлении фиктивного элемента.Вы создаете новую копию переменной nums.Чтобы избежать этого, вы можете использовать предложенный здесь метод np.append() или просто заменить

nums = nums + [nums[-1] + 1]  

на

nums += [nums[-1] + 1]  

Таким образом, вы не будете создавать новый список.

0 голосов
/ 26 сентября 2019

Это потому, что если ваша вторая строка в removeDuplicates:

nums = nums + [nums[-1] + 1]  # add a dummy element to the end of the list

Это создает новую копию параметра списка nums, который был передан по ссылке, и ваши операции удаления дубликатов изменяют копиювместо исходного списка.

У вашей функции также есть другие проблемы, без этой строки я получаю вывод:

>>> nums = [1, 1, 1, 2, 2, 3, 4, 4, 4, 5, 5]
>>> removeDuplicates(nums)
[1, 2, 3, 4, 2, 3, 4, 4, 4, 5]

Посмотрите на этот превосходный ответ для лучших подходов: https://stackoverflow.com/a/7961390/11776945

...