Очистить переменную в Python

207

Есть ли способ очистить значение переменной в Python?

Например, если я реализовывал двоичное дерево:

Class Node:
    self.left = somenode1
    self.right = somenode2

Если бы я хотел удалить какой-то узел из дерева, мне нужно было бы установить self.leftего пустым.

Bnicholas
источник

Ответы:

157

Что не так с self.left = None?

bnaul
источник
19
Не знаком с ключевым словом None. Это похоже на нуль в других языках?
Bnicholas
6
Да; это эквивалентно нулю.
Smashery
12
@Bnicholas Тем не менее, это не так, как nullв PHP, так как установка переменной nullв PHP дает вам подобное поведение в большинстве случаев, как если бы вы не определили его в первую очередь. Значение Noneв Python сильно отличается от неопределенной переменной. впрочем, Noneкак и большинство других воплощений null(пока мы не углубимся в более загадочные детали, по крайней мере).
Бен
Это не ключевое слово; это имя по умолчанию для встроенного объекта. Вы можете делать с Noneэтим все, что можете, с любым другим «простым» объектом неопределенного типа: хранить его в контейнерах, выводить на него строковое представление, проверять на нем некоторые метаданные ... В любом случае, вы пробовали Google для «python null» эквивалент "? Я серьезно; это займет немного анализа, но информация тут же.
Карл Кнехтель
18
Откройте терминал Python и введите print xи нажмите Enter. Это приведет к ошибке интерпретатора, как и большинство языков, когда вы пытаетесь напечатать неопределенную переменную. Но если вы определяете переменную, а затем пытаетесь очистить ее с помощью None, использование print xкода приведет к Noneвыводу слова . Я новичок в python, поэтому могу ошибаться, но это не похоже на поведение очищенной переменной.
Musixauce3000
408

delКлючевое слово будет делать.

>>> a=1
>>> a
1
>>> del a
>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined

Но в этом случае я голосую за self.left = None

starrify
источник
18
иногда это не удаляет его полностью, а только удаляет эту ссылку в памяти. Это может оставить призрачные переменные в памяти, которые не получают gc.
Якоб Бойер
4
delНедостатком также является то, что при попытке удалить несуществующую переменную выдается исключение, что обычно нежелательно.
Филипп Кернс
33
Я просто хотел отметить, что если вы случайно объявили переменную, которая перезаписывает встроенные команды, например, type=… когда вы намеревались печатать, type(…)то удаление - это самый простой способ вернуть исходную функциональность. То есть, если вы оставите его как None, вы все равно будете ограничивать доступ к основной функции.
mpacer
2
Сборка мусора / Сборщик / Собранный
mccc
1
Это был тот, кого я искал. Играя в строке cmd, я ... set = set(myList)и потом понял, что больше не могу использовать set как функцию (дох). Использование del setпозволило мне использовать его снова как FX. Конечно, я бы никогда не использовал этот зарезервированный var в реальном скрипте.
jbchurchill
111

var = None «очищает значение», устанавливая значение переменной как «нулевое», как значение «Нет», однако указатель на переменную остается.

del var полностью удаляет определение для переменной

В случае, если вы хотите использовать переменную позже, например, установите для нее новое значение, то есть сохраните переменную, Noneбудет лучше.

user11788
источник
Что делать, если я хочу полностью удалить переменную, которая в некоторых случаях не существует. Есть ли параметр, чтобы избежать ошибки? Мне нужно удалить несколько переменных: del a, b, c, d Я мог бы использовать цикл и попробовать / исключать, но я предпочитаю какой-то переключатель, чтобы избежать этого.
Тедо Врбанец
63

На самом деле, это не удаляет переменную / свойство. Все, что он будет делать, это установить его значение на None, поэтому переменная все равно будет занимать место в памяти. Если вы хотите полностью стереть все существование переменной из памяти, вы можете просто набрать:

del self.left
Вирадж Шах
источник
8
Я не понимаю, почему ответ = Нет так популярен. Это правильный ответ
Николай Громов
1
ОП сказал clearнет remove. del убьет атрибут и поиск. Лучше установить его на None, чем проверить, if self.leftи этого будет достаточно, чтобы проверить, пуст ли узел.
user1767754
«Чище установить его в None» - стоит учесть, что если кто-то (вы сами или соавтор) читаете код del, ИМХО делает более очевидным, что переменная может быть забыта при умственном разборе ' код.
Карманы и
1
@NikolayGromov в вашем повседневном коде, когда вы хотите получить значение self.left, вы предпочитаете проверять if self.left:, или вы предпочитаете иметь дело с возможным исключением NameError, которое приведет к сбою вашей программы, если вы не будете обрабатывать его везде ?
Pierre.Sassoulas
33
  • Если хотите полностью удалить его, используйте del:

    del your_variable

  • Или иначе, чтобы сделать значениеNone :

    your_variable = None

  • Если это итерация (например, список или кортеж), вы можете сделать его пустым, например:

    your_variable.clear()

Тогда your_variableбудет пусто

U10-Forward
источник
Для второй опции «очистить ее содержимое» неверно, это только переназначит переменную на None, исходный объект все равно останется (если только его счетчик ссылок не уменьшится до нуля, в этом случае он будет собирать мусор).
cs95
0

Вы хотите удалить переменную, не так ли?

хорошо, я думаю, что у меня есть лучшая альтернатива к ответу @bnul:

Вы можете удалить отдельные имена с помощью del:

del x или вы можете удалить их из объекта globals ():

for name in dir(): if not name.startswith('_'): del globals()[name]

Это просто пример цикла; он защищенно удаляет только имена, которые не начинаются с подчеркивания, делая (не безосновательное) предположение, что вы использовали имена без подчеркивания в начале в вашем интерпретаторе. Вместо этого вы можете использовать жестко запрограммированный список имен (белый список), если вы действительно хотите быть тщательным. Для очистки нет встроенной функции, кроме выхода и перезапуска интерпретатора.

Импортированные вами модули (импортированные ОС) будут оставаться импортированными, поскольку на них ссылается sys.modules; последующий импорт будет повторно использовать уже импортированный объект модуля. Вы просто не будете иметь ссылку на них в своем текущем глобальном пространстве имен.

Пожалуйста, пересмотрите этот ответ!

Федерико Мигелетто
источник
-1

Я использовал несколько вариантов, упомянутых выше:

del self.left

или установка значения Нет, используя

self.left = None

Важно знать различия и использовать несколько обработчиков исключений, когда вы используете значение None. Если вы печатаете значение условных операторов, используя шаблон, скажем,

print("The value of the variable is {}".format(self.left))

Вы можете увидеть значение переменной печати «Значение переменной Нет». Таким образом, вам нужно было бы разместить там несколько обработчиков исключений:

if self.left:
    #Then only print stuff

Приведенная выше команда будет печатать только значения, если self.left не None

Навнеет Кумар
источник