Добавление пустого списка со списком в рекурсивную функцию

1
def permute(nums):
    result = []
    get_permute([], nums, result)
    return result

def get_permute(current, num, result):

    if not num:
        result.append(current+[])

    for i, v in enumerate(num):
        current.append(num[i])
        get_permute(current, num[:i] + num[i + 1:], result)
        current.pop()

if __name__ == "__main__":

    r = permute([1,2,3])

    for perm in r:
        print(perm)

Что делает current + [] в result.append(current+[]) если я result.append(current+[]) +[] он печатает пустые списки.

Теги:
python-3.x

2 ответа

4

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

Вы должны иметь возможность заменить его current.copy() (используя Python> = 3.3) или list(current) чтобы избежать подобной путаницы среди будущих читателей. (Существует много способов скопировать список. Выберите тот, который вам нравится, и придерживайтесь его.)

2

Что делает + []?

Он генерирует новый список с тем же содержимым, что и старый список.

>>> x = [1]
>>> id(x) == id(x + [])
False
>>> x == x + []
True

Зачем мне это нужно?

Если вы добавите копии в свой результат, у вас будет один и тот же список много раз в вашем результате, и каждый раз, когда вы обновляете этот список, это влияет на ваш результат.

>>> x = [1, 2]
>>> result = []
>>> result.append(x)
>>> x.append(3)
>>> result.append(x)
>>> result
[[1, 2, 3], [1, 2, 3]]

Некоторые возможные способы сделать их более удобочитаемыми

result.append(current[:])

или же

result.append(list(current))

Почему он возвращает пустые списки, если вы удаляете + []?

Потому что, если вы не добавляете копии к результату, в результате будет только один список, но несколько раз. И вы вызываете .append(num[i]) в этом списке так же часто, как .pop(), что приводит к тому, что этот список пуст.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню