2014-03-03 5 views
1

Я пишу простой алгоритм DFS, но когда я запускаю функцию, кажется, что аргумент, который я передаю, переносится в следующий вызов. Я чувствую себя немного комфортно с тем, как работает обзор Python, но я никогда не рассматривал, как работает область действия для аргументов. Может ли кто-нибудь объяснить, как происходит эта проблема?Область аргументов Python - те же объекты?

Единственная причина, по которой я могу думать, это то, что значение по умолчанию, которое я задаю, не создается заново каждый раз, когда я запускаю функцию ...?

График объекта:

graph = { 
     1: [2,8,12], 
     2: [3,7], 
     3: [4,5,6], 
     8: [9], 
     9: [10,11], 
     12: [13], 
     13: [14] 
     } 

DFS Алгоритм:

def dfs_dict(graph, curr, val, path=[]): 
    path.append(curr) 
    print "Path: " + str(path) 
    if curr == val: 
    return path 
    else: 
    if curr in graph: # not a disconnected node/leaf 
     for child in graph[curr]: 
     if child not in path: 
      tmp = dfs_dict(graph, child, val, path) 
      if tmp: 
      return tmp 

Как я бегу DFS:

if __name__ == '__main__': 
    print dfs_dict(graph, 1, 13) 
    print dfs_dict(graph, 1, 7) 

ВЫВОД:

Path: [1] 
Path: [1, 2] 
Path: [1, 2, 3] 
Path: [1, 2, 3, 4] 
Path: [1, 2, 3, 4, 5] 
Path: [1, 2, 3, 4, 5, 6] 
Path: [1, 2, 3, 4, 5, 6, 7] 
Path: [1, 2, 3, 4, 5, 6, 7, 8] 
Path: [1, 2, 3, 4, 5, 6, 7, 8, 9] 
Path: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
Path: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] 
Path: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] 
Path: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] 
Path: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1] 
None 

ответ

2

Вопрос Значение по умолчанию path здесь: def dfs_dict(graph, curr, val, path=[]):

Список инстанциирован раз, когда код первого чтения, а затем тот же экземпляр используется более и более, как показано в следующем примере:

>>> def foo(bar=[]): 
... bar.append(1) 
... print(bar) 
... 
>>> foo() 
[1] 
>>> foo() 
[1, 1] 
>>> foo() 
[1, 1, 1] 
>>> bar 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'bar' is not defined 

Вы должны начать свою функцию, как это вместо:

def dfs_dict(graph, curr, val, path=None): 
    if path is None: 
     path = [] 

EDIT: Кроме того, как списки mutables, вы, вероятно, следует сделать копию в начале dfs_dict, чтобы не изменить тот использовал в «родительский» кадр стека, когда вы добавляете элементы.

+0

Я думал, что аргумент был создан при вызове функции, а не при первом чтении кода. Спасибо за разъяснения. –

Смежные вопросы