Как изменить элементы списка без использования функции возврата - PullRequest
0 голосов
/ 21 октября 2019

Действительно, извините за мой плохой английский.

Я сделал две функции для постоянного изменения (фактически удаления одного за другим) элементов в списке и отображения последнего элемента в конце, но функции удаленияне оказывает влияния на список, который я хочу изменить.

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

Сначала я даю список в качестве аргумента одной из сделанных мной функций, удаляя функцию. Функция удаления удаляет элемент, пока у него не будет только одного элемента, ИСПОЛЬЗУЯ ДРУГУЮ ФУНКЦИЮ. В этой функции я вставил другую функцию (я вызову эту функцию проверки). Функция проверки проверяет удаляемые элементы и «фактически» удаляет один элемент в моем коде, но ничего не возвращает.

ПожалуйстаОбратите внимание, что переменные x и y - это случайные значения в диапазоне длины seq (я не писал этого в моем примере кода), и они будут меняться каждый раз в цикле while при удалении функции.

import random


def checking(x, y, seq):
    positions = [x, y]
    positions.sort()

    if seq[x] == 'b' and seq[y] == 'b':
        seq.pop(positions[1])
        seq.pop(positions[0])
        seq.append('a')
    else:
        seq.pop(positions[1])
        seq.pop(positions[0])
        seq.append('b')

def removing(seq):
    while len(seq) != 1:
        x, y = random1, random2
        remove(x, y, list(seq))
    return seq[0]

final(['a','a','b','a','b'])

Iпроверенная функция проверки работает хорошо, таким образом, я думаю, что это проблема удаления функции.

Я ожидал, что список seq изменяется каждый раз, когда передается функция 'remove', и, наконец, возвращает последний элемент, но ничего не изменилось и застряло вбесконечный цикл.

Спасибо, что прочитали мой вопрос.

1 Ответ

1 голос
/ 21 октября 2019

list(seq) создает новый экземпляр списка, где его элементы являются полными копиями seq элементов.

По этой причине цикл while никогда не завершается, поскольку список никогда не очищается.

Передайте тот же самый seq в remove функцию вместо создания нового экземпляра списка.

remove(x, y, seq)

Когда данный аргумент является кортежем, преобразуйте его в изменяемый список перед входом в цикл:

seqm = list(seq)
while len(seqm) != 1:
    x, y = random1, random2
    remove(x, y, seqm)
return seqm[0]
...