2016-09-25 3 views
-2

Позвольте мне переписать мой вопрос так, чтобы он был яснее. Я столкнулся с проблемой проблемы LeetCode: проверьте двоичное дерево поиска.переменная класса рекурсии python

Моего первое решение выглядит примерно так:

class Solution(object): 
    def recursion(self, input, var_x, ans): 
     #update var_x 
     #update ans 
     self.recursion(input, var_x, ans) 

    def mySolution(self, input): 
     ans = [] 
     var_x = 0 
     self.recursion(input, var_x, ans) 
     return ans 

Это решение не может пройти тест. Но после того, как я сделал простое изменение, она проходит:

class Solution(object): 
    def recursion(self, input, ans): 
     #update self.var_x 
     #update ans 
     self.recursion(input, ans) 

    def mySolution(self, input): 
     ans = [] 
     self.var_x = 0 
     self.recursion(input, ans) 
     return ans 

Какая разница, что объявить var_x против self.var_x? Я думаю, что эти два имеют такой же эффект в этой проблеме, но один проходит тест, другой нет?

+0

Пожалуйста, проверьте свой отступ. –

+1

удивительно, что он работает лучше, поскольку вы все еще делаете 'prev = node' (no' self.prev'). Пожалуйста, предоставьте (правильно отступы) [mcve] –

+0

Поскольку это своего рода сайт для кодирования, я не хочу много говорить, но вы, возможно, неправильно поняли, как они представляют данные. Похоже, вы получаете представление массива упакованного бинарного дерева, где дети узла N пронумерованы 2N и 2N + 1. Напротив, вы создаете фактическое дерево с узловыми объектами, и это может быть ... излишним. –

ответ

0

Семантическая разница проста: var_x - это всего лишь локальная переменная, по одному на экземпляр вызова. self.var_x - это атрибут объекта, по одному на экземпляр класса.

Если вам нужно значение только внутри экземпляра одного вызова, используйте var_x и не беспокойтесь об объектах с сохранением переходного значения. Если вам это нужно как свойство долгосрочного объекта (атрибут), используйте self.var_x.