Оператор Print перед оператором return дает правильные значения, но функция возвращает Nonetype - PullRequest
0 голосов
/ 23 января 2020

У меня есть реализация функции, которая сортирует стек. Функция 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]

1 Ответ

0 голосов
/ 23 января 2020

Вставить немного основы c Инструментарий трассировки:

indent = "" def sortStack (stack1, stack2): глобальный отступ печати (indent + "ENTER sortStack", stack1.stack, stack2.stack) indent + = ""

if stack1.isEmpty() is False:
    if stack2.isEmpty() is True:
        item = stack1.popOut()
        stack2.push(item)
        sortStack(stack1,stack2)
        print(indent + "LEAVE sortStack case A")
        indent = indent[2:]
    elif stack1.peek() < stack2.peek():
        item = stack1.popOut()
        stack2.push(item)
        sortStack(stack1,stack2)
        print(indent + "LEAVE sortStack case B")
        indent = indent[2:]
    else:
        item = stack1.popOut()
        stack1.push(stack2.popOut())
        stack2.push(item)
        sortStack(stack1,stack2)
        print(indent + "LEAVE sortStack case C")
        indent = indent[2:]
else:
    print(indent + "      sortStack at bottom", stack2.stack)
    stack1 = stack2
    print(indent + "LEAVE sortStack at bottom", stack1.stack)
    indent = indent[2:]
    return stack1

Вывод:

ENTER sortStack [5, 4, 6] []
  ENTER sortStack [5, 4] [6]
    ENTER sortStack [5] [6, 4]
      ENTER sortStack [4] [6, 5]
        ENTER sortStack [] [6, 5, 4]
                sortStack at bottom [6, 5, 4]
          LEAVE sortStack at bottom [6, 5, 4]
        LEAVE sortStack case B
      LEAVE sortStack case C
    LEAVE sortStack case B
  LEAVE sortStack case A
returned None
[6, 5, 4]

Ваша проблема: только ваш самый внутренний вызов возвращает любое значение; остальные отбрасывают то, что этот внутренний вызов проходит обратно вверх по линии. Это возвращает None.


REPAIR

Поместите предполагаемое возвращаемое значение в новую переменную; вернуть это при любом выходе.

indent = "" def sortStack (stack1, stack2): глобальный отступ печати (indent + "ENTER sortStack", stack1.stack, stack2.stack) indent + = ""

if stack1.isEmpty() is False:
    if stack2.isEmpty() is True:
        item = stack1.popOut()
        stack2.push(item)
        result = sortStack(stack1,stack2)
        print(indent + "LEAVE sortStack case A")
        indent = indent[2:]
    elif stack1.peek() < stack2.peek():
        item = stack1.popOut()
        stack2.push(item)
        result = sortStack(stack1,stack2)
        print(indent + "LEAVE sortStack case B")
        indent = indent[2:]
    else:
        item = stack1.popOut()
        stack1.push(stack2.popOut())
        stack2.push(item)
        result = sortStack(stack1,stack2)
        print(indent + "LEAVE sortStack case C")
        indent = indent[2:]
else:
    result = stack2
    print(indent + "LEAVE sortStack at bottom", result.stack)
    indent = indent[2:]

return result

ВЫХОД:

ENTER sortStack [5, 4, 6] []
  ENTER sortStack [5, 4] [6]
    ENTER sortStack [5] [6, 4]
      ENTER sortStack [4] [6, 5]
        ENTER sortStack [] [6, 5, 4]
          LEAVE sortStack at bottom [6, 5, 4]
        LEAVE sortStack case B
      LEAVE sortStack case C
    LEAVE sortStack case B
  LEAVE sortStack case A
returned [6, 5, 4]
[6, 5, 4]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...