아래에 제시된 상황에서 파이썬이 어떻게 작동하는지 이해하는데 어려움이 있습니다.리스트를 재귀 적으로 확장하는 파이썬
나는 목록의 모든 순열을 재귀 적으로 계산하고 있으며 모든 순열을 가진 목록의 목록을 반환하고자합니다. 코드를 그냥 인쇄하면 잘 작동하지만 최종 결과를 확장하려고하면 입력 목록과 동일한 값의 목록으로 끝납니다 (단어 목록을 반복하는 데 죄송합니다)
def swap(l, i, j):
l[i], l[j] = l[j], l[i]
def compute(l):
if not len(l):
print 'no list'
start, end = 0, len(l) - 1
return _compute(l, start, end)
def _compute(l, start, end):
res = []
if start == end:
return [l]
else:
for i in range(start, end+1):
swap(l, start, i)
res.extend(_compute(l, start+1, end))
swap(l, start, i) # backtrack
return res
l = [1,2,3]
print compute(l)
그리고 결과 : 내 코드입니다
[[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]
내가 말했듯이, 난 그냥이 예상대로 작동 결과를 인쇄하는 경우 :
def swap(l, i, j):
l[i], l[j] = l[j], l[i]
def compute(l):
if not len(l):
print 'no list'
start, end = 0, len(l) - 1
_compute(l, start, end)
def _compute(l, start, end):
if start == end:
print l
else:
for i in range(start, end+1):
swap(l, start, i)
_compute(l, start+1, end)
swap(l, start, i) # backtrack
l = [1,2,3]
compute(l)
출력 :
[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 2, 1]
[3, 1, 2]
이유는 무엇입니까?
** 같은 ** 목록에 ** 참조 **를 추가 할 때마다. 따라서 한 지점의 목록 수정은 다른 지점에 반영됩니다. –