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+[])
+[]
он печатает пустые списки.
Это делает копию списка. Когда вы удаляете его, вы запускаете в список изменений списков, отраженных в контекстах неожиданностей, потому что внешний список содержит много ссылок на один и тот же список, а не ссылки на множество разных списков.
Вы должны иметь возможность заменить его current.copy()
(используя Python> = 3.3) или list(current)
чтобы избежать подобной путаницы среди будущих читателей. (Существует много способов скопировать список. Выберите тот, который вам нравится, и придерживайтесь его.)
+ []
?Он генерирует новый список с тем же содержимым, что и старый список.
>>> 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()
, что приводит к тому, что этот список пуст.