诡异的python类的实例方法,返回值为什么是None??

popwbob 2016-12-30 07:50:30
今天遇到的python类实例方法返回值为None的问题,同样写了个简单类来验证,可是问题不能找到原因。

#参照类,工作正常,返回值如预期
class test:
def __init__(self, a, b):
self.a = a
self.b = b
self.s = None
def ser(self, c):
self.s = [self.a ,self.b , c]
try:
123 + '123'
except:
return self.s

#下面类的实例方法为什么返回值为None?????????
#测试用数据
#(城市ID,上级城市ID,城市序号,城市名称
departments = [(2, 1, 1, '北京'),(3, 1, 2, '上海'),(4, 1, 3, '广州'),(5, 1, 4, '湖南'),(6, 5, 1, '长沙'),(7, 1, 5, '河北')]
#(用户ID,用户所在城市ID,用户序号,用户姓名)
users = [(1, 2, 1, 'qq'),(2, 3, 2, 'aa'),(3, 4, 3, 'zz'),(4, 5, 4, 'ww'),(5, 6, 5, 'ss'),(6, 7, 6, 'xx')]
#通信录的根节点
root=(1,None,1,'中国')

class StructureTree:
def __init__(self, deps, users):
self.deps = deps
self.users = users
self.node_order = []
self.stack = []
def select_in_tuple(self, list, value,index):
ck = []
for node in list:
if node[index] == value:
ck.append(node)
ck.sort(key=lambda node: node[2])
return ck
def pile_tree(self, node):
users=self.select_in_tuple(self.users, node[0],1)
self.node_order.extend(users)
children = self.select_in_tuple(self.deps, node[0],1)
if len(children) == 0:
try:
next_node=self.stack.pop()
self.node_order.append(next_node)
self.pile_tree(next_node)
except:
print('return self.node_order->',self.node_order) #返回前打印值为正常,返回后却成了None
return self.node_order
elif len(children)==1:
self.node_order.append(children[0])
self.pile_tree(children[0])
else:
self.stack.extend(children[:0:-1])
self.node_order.append(children[0])
self.pile_tree(children[0])

a = test(1, 2)
print(a.ser(3))

st=StructureTree(departments,users)
print(st.pile_tree(root))

输出::

>>>[1, 2, 3]
>>>return self.node_order-> [(2, 1, 1, '北京'), (1, 2, 1, 'qq'), (3, 1, 2, '上海'), (2, 3, 2, 'aa'), (4, 1, 3, '广州'), (3, 4, 3, 'zz'), (5, 1, 4, '湖南'), (4, 5, 4, 'ww'), (6, 5, 1, '长沙'), (5, 6, 5, 'ss'), (7, 1, 5, '河北'), (6, 7, 6, 'xx')]
>>>None
...全文
1215 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
混沌鳄鱼 2016-12-30
  • 打赏
  • 举报
回复 1
这个多出来的None是你的外层print(st.pile_tree(root)) 打印出来的。 这个是你定义方法 def pile_tree(self, node): users=self.select_in_tuple(self.users, node[0],1) self.node_order.extend(users) children = self.select_in_tuple(self.deps, node[0],1) if len(children) == 0: try: next_node=self.stack.pop() self.node_order.append(next_node) self.pile_tree(next_node) except: print('return self.node_order->',self.node_order) #返回前打印值为正常,返回后却成了None return self.node_order elif len(children)==1: self.node_order.append(children[0]) self.pile_tree(children[0]) else: self.stack.extend(children[:0:-1]) self.node_order.append(children[0]) self.pile_tree(children[0]) 你这个方法(函数)没有写显示的return语句, 在python中会隐式地返回一个None return_value = st.pile_tree(root) print(return_value ) 这样肯定会多打印出一个None的 你调用的实例方法的时候既然已经在方法里面打印输出了,就直接调用吧。 或者在在方法中return要打印的值,在外层打印。

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧