【发布时间】:2020-05-09 04:48:45
【问题描述】:
我有一个对堆栈进行排序的函数的实现。函数 sortStack 正确地对堆栈进行排序,但是当我打印堆栈时,它似乎正在修改初始参数 newStack2。为什么return语句返回None?它与通过引用/别名传递有关吗?
class Stack():
def __init__(self):
self.stack = []
def push(self,val):
if len(self.stack)>=0:
self.stack.append(val)
else:
return None
def popOut(self):
if len(self.stack) > 0:
item = self.stack[-1]
self.stack.pop()
return item
else:
return None
def peek(self):
if self.isEmpty() == True:
return None
else:
return self.stack[-1]
def isEmpty(self):
if len(self.stack) == 0:
return True
else:
return False
def sortStack(stack1,stack2):
if stack1.isEmpty() is False:
if stack2.isEmpty() is True:
item = stack1.popOut()
stack2.push(item)
sortStack(stack1,stack2)
elif stack1.peek() < stack2.peek():
item = stack1.popOut()
stack2.push(item)
sortStack(stack1,stack2)
else:
item = stack1.popOut()
stack1.push(stack2.popOut())
stack2.push(item)
sortStack(stack1,stack2)
else:
stack1 = stack2
return stack1
if __name__ == '__main__':
newStack = Stack()
newStack.push(5)
newStack.push(4)
newStack.push(6)
newStack2 = Stack()
print(sortStack(newStack,newStack2))
print(newStack2.stack)
输出:
None
[6, 5, 4]
【问题讨论】:
-
Python 从不使用 pass-by-reference 作为评估策略,所以不,它与此没有任何关系。
-
无论如何,如果您进入外部
else子句,您只会在sortStack中返回任何内容。这就是为什么它返回None -
@juanpa.arrivillaga 是的,但是那个分支——表面上是最后的操作——返回
stack1,而不是递归调用返回的None值。思路是排序后的列表原封不动为stack2,然后赋值给stack1,然后返回。 -
没关系;我只是追踪了执行情况。这种情况是最里面的,而不是最后的回报。
标签: python return parameter-passing pass-by-reference alias