2013-12-12 190 views
3

我正在嘗試生成Ω的西格代數。 我正在尋找如何替換全局變量。 這裏Ω= [1,2,3]。Python:代替全局變量

global sigma 
sigma=[[]] 
def buildDTree(sofar, todo): 
    global sigma 
    sal=[] 
    if len(todo)==0: 
     return binaryTree(sofar) 
    else: 
     withelt=buildDTree(sofar + [todo[0]],todo[1:]) 
     withoutelt=buildDTree(sofar, todo[1:]) 
     here=binaryTree(sofar) 
     here.setLeftBranch(withelt) 
     here.setRightBranch(withoutelt) 
     sal+=(here.getLeftBranch().getValue()) 
     sigma+=[sal] 
     return here 
buildDTree([], [1,2,3]) 
print sigma 
+1

編寫類和使用屬性。 – smeso

回答

4

最簡單的方法是將關鍵字參數添加到您的遞歸函數,並返回結果西格瑪:

def buildDTree(sofar, todo, sigma=None): 
    if sigma is None: 
     sigma = [[]] 
    sal = [] 
    if not todo: 
     return sigma, binaryTree(sofar) 
    else: 
     _, withelt = buildDTree(sofar + [todo[0]], todo[1:], sigma) 
     _, withoutelt = buildDTree(sofar, todo[1:], sigma) 
     here = binaryTree(sofar) 
     here.setLeftBranch(withelt) 
     here.setRightBranch(withoutelt) 
     sal += here.getLeftBranch().getValue() 
     sigma += [sal] 
     return sigma, here 

sigma, _ = buildDTree([], [1,2,3]) 

這至少使得sigma「本地」的遞歸調用。

更好的方法是使一個類:

class DTreeBuilder(object): 
    def __init__(self): 
     self.sigma = [[]] 

    def buildDTree(self, sofar, todo): 
     sal = [] 
     if len(todo) == 0: 
      return binaryTree(sofar) 
     else: 
      withelt = buildDTree(sofar + [todo[0]], todo[1:]) 
      withoutelt = buildDTree(sofar, todo[1:]) 
      here = binaryTree(sofar) 
      here.setLeftBranch(withelt) 
      here.setRightBranch(withoutelt) 
      sal += here.getLeftBranch().getValue() 
      self.sigma += [sal] 
      return here 

,並用它喜歡:

builder = DTreeBuilder() 
builder.build([], [1,2,3]) 
print builder.sigma 
+0

太棒了!謝謝Martjin !!!!! :d – SirAlex