2013-12-12 147 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