如何在Python中将对象类的实例化定义为全局变量?

时间:2018-12-19 15:41:34

标签: python global-variables instance

我是一名初学者,想将dfs代码与Fibonacci系列生成代码集成在一起。斐波那契代码也像dfs一样运行,调用从左到右。 集成仍不完整。

我有两个问题:
(i)无法在fib()中正确更新“路径”,因为输出未正确描述该路径。

(ii)作为注释在下面的fib()函数中声明。

P.S.

还有一个与程序的工作有关的问题:

(iii)在将第16行修改为:stack = root = stack [1:];得到与以前相同的输出。

import sys
count = 0
root_counter = 0
#path=1
inf = -1
node_counter = 0
root =0

def get_depth_first_nodes(root):
    nodes = []
    stack = [root]
    while stack:
        cur_node = stack[0]
        stack = stack[1:]
        nodes.append(cur_node)        
        for child in cur_node.get_rev_children():
            stack.insert(0, child)
    return nodes

def node_counter_inc():
     global node_counter
     node_counter = node_counter + 1

class Node(object):
    def __init__(self, id_,path):
        self.id = node_counter_inc() 
        self.children = []
        self.val = inf #On instantiation, val = -1, filled bottom up; 
                       #except for leaf nodes
        self.path = path                
    def __repr__(self):
        return "Node: [%s]" % self.id     
    def add_child(self, node):
        self.children.append(node)     
    def get_children(self):
        return self.children        
    def get_rev_children(self):
        children = self.children[:]
        children.reverse()
        return children        

def fib(n, level, val, path):
    global count, root_counter, root
    print('count :', count, 'n:', n, 'dfs-path:', path)
    count += 1
    if n == 0 or n == 1:
        path = path+1
        root.add_child(Node(n, path))
        return n
    if root_counter == 0:
        root = Node(n, path)
        root_counter = 1
    else:
        #cur_node.add_child(Node(n, path)) -- discarded for next(new) line
        root.add_child(Node(n, path))   
    tmp = fib(n-1, level + 1,inf, path) + fib(n-2, level + 1,inf,path+1)
    #Issue 2: Need update node's val field with tmp.  
    #So, need suitable functions in Node() class for that.
    print('tmp:', tmp, 'level', level)
    return tmp

def test_depth_first_nodes():
     fib(n,0,-1,1)  
     node_list = get_depth_first_nodes(root)
     for node in node_list:
         print(str(node))

if __name__ == "__main__":
     n = int(input("Enter value of 'n': ")) 
     test_depth_first_nodes() 

要添加here中的代码构思。

1 个答案:

答案 0 :(得分:1)

第一个问题的答案:

此特定问题中的路径是一个整数。它是从根到叶子的贪婪dfs方式编号。

这可以通过使path为全局变量而不是fib函数的输入来实现。每当到达叶子时,我们都会增加路径计数。

我还修改了fib函数以返回节点而不是数字。

import sys
count = 0
root_counter = 0
path=1
inf = -1
node_counter = 0
root = None

def node_counter_inc():
     global node_counter
     node_counter = node_counter + 1
     print("node_counter:", node_counter)
     return node_counter   

class Node(object):
    def __init__(self, id__,path):
        print("calling node_counter_inc() for node:", n )
        try:
            self.id = int(node_counter_inc())
        except TypeError:
            self.id = 0  # or whatever you want to do

        #self.id = int(node_counter_inc())
        self.val = inf #On instantiation, val = -1, filled bottom up; 
                       #except for leaf nodes
        self.path = path
        self.left = None
        self.right = None

    def __repr__(self):
        return "Node" + str(self.id) + ":"+ str(self.val)          


def fib(n, level, val):
    # make fib returns a node rather than a value
    global count, root_counter, root, path
    print('count :', count, 'n:', n, 'dfs-path:', path)
    count += 1
    if n == 0 or n == 1:
        path = path+1
        new_Node = Node(n, path)
        new_Node.val = n
        return new_Node
        #root.add_child(new_Node)
    #    return new_node
    #if root_counter == 0:
    #   root = Node(n, path)
    #   root_counter = 1
    #else:
        #cur_node.add_child(Node(n, path)) -- discarded for next(new) line
    #    root.add_child(Node(n, path))   
    #tmp = fib(n-1, level + 1,inf) + fib(n-2, level + 1,inf)

    #Issue 2: Need update node's val field with tmp.  
    #So, need suitable functions in Node() class for that.
    #print('tmp:', tmp, 'level', level)
    #return tmp
    ans = Node(n, path)
    ans.left = fib(n-1, level + 1, inf)
    ans.right = fib(n-2, level + 1, inf)
    ans.val = ans.left.val + ans.right.val
    print("the node is", ans.id, "with left child", ans.left.id, "and right child", ans.right.id)
    print("the corresponding values are",  ans.val, ans.left.val, ans.right.val)
    return ans

def test_depth_first_nodes():
     ans = fib(n,0,-1)
     print("The answer is", ans.val)
     #node_list = get_depth_first_nodes(root)
     #for node in node_list:
     #    print(str(node))

if __name__ == "__main__":
     n = int(input("Enter value of 'n': ")) 
     test_depth_first_nodes()