Есть ли способ очистить значение переменной в Python?
Например, если я реализовывал двоичное дерево:
Class Node:
self.left = somenode1
self.right = somenode2
Если бы я хотел удалить какой-то узел из дерева, мне нужно было бы установить self.left
его пустым.
Ответы:
Что не так с
self.left = None
?источник
null
в PHP, так как установка переменнойnull
в PHP дает вам подобное поведение в большинстве случаев, как если бы вы не определили его в первую очередь. ЗначениеNone
в Python сильно отличается от неопределенной переменной. впрочем,None
как и большинство других воплощенийnull
(пока мы не углубимся в более загадочные детали, по крайней мере).None
этим все, что можете, с любым другим «простым» объектом неопределенного типа: хранить его в контейнерах, выводить на него строковое представление, проверять на нем некоторые метаданные ... В любом случае, вы пробовали Google для «python null» эквивалент "? Я серьезно; это займет немного анализа, но информация тут же.print x
и нажмите Enter. Это приведет к ошибке интерпретатора, как и большинство языков, когда вы пытаетесь напечатать неопределенную переменную. Но если вы определяете переменную, а затем пытаетесь очистить ее с помощью None, использованиеprint x
кода приведет кNone
выводу слова . Я новичок в python, поэтому могу ошибаться, но это не похоже на поведение очищенной переменной.del
Ключевое слово будет делать.Но в этом случае я голосую за
self.left = None
источник
del
Недостатком также является то, что при попытке удалить несуществующую переменную выдается исключение, что обычно нежелательно.type=…
когда вы намеревались печатать,type(…)
то удаление - это самый простой способ вернуть исходную функциональность. То есть, если вы оставите его как None, вы все равно будете ограничивать доступ к основной функции.set = set(myList)
и потом понял, что больше не могу использовать set как функцию (дох). Использованиеdel set
позволило мне использовать его снова как FX. Конечно, я бы никогда не использовал этот зарезервированный var в реальном скрипте.var = None
«очищает значение», устанавливая значение переменной как «нулевое», как значение «Нет», однако указатель на переменную остается.del var
полностью удаляет определение для переменнойВ случае, если вы хотите использовать переменную позже, например, установите для нее новое значение, то есть сохраните переменную,
None
будет лучше.источник
На самом деле, это не удаляет переменную / свойство. Все, что он будет делать, это установить его значение на
None
, поэтому переменная все равно будет занимать место в памяти. Если вы хотите полностью стереть все существование переменной из памяти, вы можете просто набрать:источник
clear
нетremove
. del убьет атрибут и поиск. Лучше установить его на None, чем проверить,if self.left
и этого будет достаточно, чтобы проверить, пуст ли узел.del
, ИМХО делает более очевидным, что переменная может быть забыта при умственном разборе ' код.if self.left:
, или вы предпочитаете иметь дело с возможным исключением NameError, которое приведет к сбою вашей программы, если вы не будете обрабатывать его везде ?Если хотите полностью удалить его, используйте
del
:del your_variable
Или иначе, чтобы сделать значение
None
:your_variable = None
Если это итерация (например, список или кортеж), вы можете сделать его пустым, например:
your_variable.clear()
Тогда
your_variable
будет пустоисточник
Вы хотите удалить переменную, не так ли?
хорошо, я думаю, что у меня есть лучшая альтернатива к ответу @bnul:
Вы можете удалить отдельные имена с помощью
del
:del x
или вы можете удалить их из объекта globals ():for name in dir(): if not name.startswith('_'): del globals()[name]
Это просто пример цикла; он защищенно удаляет только имена, которые не начинаются с подчеркивания, делая (не безосновательное) предположение, что вы использовали имена без подчеркивания в начале в вашем интерпретаторе. Вместо этого вы можете использовать жестко запрограммированный список имен (белый список), если вы действительно хотите быть тщательным. Для очистки нет встроенной функции, кроме выхода и перезапуска интерпретатора.
Импортированные вами модули (импортированные ОС) будут оставаться импортированными, поскольку на них ссылается sys.modules; последующий импорт будет повторно использовать уже импортированный объект модуля. Вы просто не будете иметь ссылку на них в своем текущем глобальном пространстве имен.
Пожалуйста, пересмотрите этот ответ!
источник
Я использовал несколько вариантов, упомянутых выше:
или установка значения Нет, используя
Важно знать различия и использовать несколько обработчиков исключений, когда вы используете значение None. Если вы печатаете значение условных операторов, используя шаблон, скажем,
Вы можете увидеть значение переменной печати «Значение переменной Нет». Таким образом, вам нужно было бы разместить там несколько обработчиков исключений:
Приведенная выше команда будет печатать только значения, если self.left не
None
источник