Как сделать все ссылочные переменные None в Python? - PullRequest
1 голос
/ 27 июня 2019

У меня есть типичный класс ListNode, как показано ниже,

class ListNode:
    def __init__(self,val, next = None):
        self.val = val
        self.next = next

Я создал два экземпляра этого класса и назначил один из объектов переменной, вызываемой next в первом экземпляре, как показано ниже,

node = ListNode(1)
next_node = ListNode(2)
node.next = next_node

Однако, если я назначу nnode = None, node.next все равно будет указывать на экземпляр next_node и не будет None.

print( next_node == node.next) # Prints True
next_node = None
print( node.next.val) # Prints 1

Как я могу заставить все ссылочные переменные (например, node.next в вышеприведенном случае) делать None без явного присвоения их None?

1 Ответ

1 голос
/ 27 июня 2019

Мне очень нравится твой вопрос.Возможно, это не совсем то, что вы ищете, но я нашел библиотеку weakref.С его помощью вы можете попытаться изменить свой код:

class ListNode:
    def __init__(self, val, next_=None):
        self.val = val
        self.next_ = next_

    def get_next(self):
        try:
            self.next_.check()
        except AttributeError: # if self.next_ exists then it does not have 'check' method.
            return self.next_
        except ReferenceError: # if it does not exists it will raise this exception
            return None

Тогда вместо назначения node.next_ = next_node вы можете создать слабый реф:

node = ListNode(1)
next_node = ListNode(2)
node.next_ = weakref.proxy(next_node)

print( next_node == node.next_) # prints True
next_node = None
print(node.get_next()) # prints None

Надеюсь, это поможет решить вашу проблему!

Редактировать: я также изменил имя next на next_, потому что next является встроенной функцией

...