2017-01-25 5 views
0

[EDITED]파이썬 재귀 내가 정말 이상한 오류가 있어요 나는 확실히 그것을 주위에 내 머리를 정리 할 수 ​​

경우에만 내부 매개 변수를 변경. for 문 내부에서 id가 여전히 1 (재귀가 시작될 때 1로 초기화 됨) 인 경우 어떻게 가능합니까?

def recursive_read(root, id, cursor, database): 
     if root.text is not None: 
      cursor.callproc('add_node', (id, root.text)) 
      database.commit() 
      #print('Adding element to db... ') 
      id = id+1 
     for elem in root.getchildren(): 
      recursive_read(elem, id, cursor, database) 

편집 :

이 완벽한 트리를 형성하지만, 불행하게도 그것은 내가 원하는 게 아니에요. 이 들여 쓰기를 "이동"하여 하위가 올바르게 부모를 참조 할 수있게하고, 텍스트가있는 요소가 만나는 경우에만 ID를 늘려야하므로 문제가 남아 있습니다.

def recursive_read(root, indent): 
    if root.text is not None: 
     print(' '*indent + '%s' % (root.text)) 
    for elem in root.getchildren(): 
     recursive_read(elem, indent+1) 

변경해야 할 사항 ID는 root.text가 None 일 때만 변경됩니다.

+0

제공 한 코드는'root.text is None' 인 경우에만 id의 값을 수정합니다. 그게 무슨 일이 일어나지 않으면이 코드 스 니펫은 오류가 아닙니다. – Olian04

+1

재귀 호출 후에'id'가 변경 될 것으로 예상됩니까? 매개 변수로 전달 된 정수는 변경되지 않으므로 호출자에서 변경되지 않습니다. 'return id'와'id = recursive_read (elem, id, cursor, database)'를 사용해야합니다. – cdarke

+0

텍스트가 None이 아닌 경우 ID를 늘리고 싶습니다. 제공된 값인 – xxxxx

답변

0

문제는 id가 전역 변수가 아닌 재귀 함수로 전달되는 매개 변수라는 점입니다. 호출에서 ID를 변경하면이 호출에서 초기화 된 후속 호출에만 영향을 주며 다른 호출에서 시작된 호출에는 영향을 미치지 않습니다.

예를 들어, 레벨 1에서 id가 for 루프 앞에 2의 값을 갖고 있다고 가정하면 루프의 각 반복은 recursive_read()에 대한 id 값으로 2를 전달합니다. 호출 된 recursive_read()가 몇 번이나 내려 가서 여러 번 id를 변경하더라도 반환되는 id는 여전히 2이고 루프의 recursive_read()에 대한 다음 호출에는 여전히 2의 값으로 전달 된 id가 있습니다.

+0

globas와 조심하십시오, 그들은 [악한] http://softwareengineering.stackexchange.com/questions/148108/why-is-global-state-so-evil ID의 현재 값을 반환하는 훨씬 더 나은 접근 @ 의견에서 제안 된 cdarke –