Очистити змінну в python


207

Чи є спосіб очистити значення змінної в python?

Наприклад, якщо я реалізував двійкове дерево:

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

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


Відповіді:


157

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


19
Не знайомий із ключовим словом None. Чи схоже це на null в інших мовах?
Bnicholas

6
Так; він еквівалентний нулю.
Smashery

12
@Bnicholas Однак це не так, як nullу PHP, якщо встановлення змінної на nullPHP надає вам подібну поведінку в більшості випадків, як ніби ви її не визначили в першу чергу. Значення Noneв Python сильно відрізняється від невизначеної змінної. Однак, Noneяк і більшість інших втілень null, (принаймні, поки ми не потрапимо до більш прихованих деталей).
Бен

Це не ключове слово; це набір за замовчуванням для вбудованого об'єкта. Ви можете зробити що завгодно, Noneщо можна зробити з будь-яким іншим "простим" об'єктом неуточненого типу: зберігати його в контейнерах, друкувати рядкове подання про нього, перевіряти на ньому деякі метадані ... Як би там не було, ви спробували Google для "python null еквівалент "? Я серйозно; знадобиться трохи аналізу, але інформація є саме там.
Карл Кнечтел

18
Відкрийте термінал пітона та введіть print xта натисніть клавішу Enter. Це призведе до помилки інтерпретатора, як і більшість мов, коли ви намагаєтеся надрукувати невизначену змінну. Але якщо ви визначите змінну, а потім спробуйте очистити її за допомогою None, за допомогою print xкоду буде створено слово Noneяк вихід. Я новачок у python, тому я можу помилитися, але це не схоже на поведінку очищеної змінної.
Musixauce3000

407

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


18
іноді це не видаляється повністю, це лише видаляє посилання на пам'ять. Це може залишити в пам'яті змінні привидів, які не отримують gc.
Якоб Бойер

4
delНедоліком є ​​також те, що якщо ви намагаєтесь видалити змінну, яка не існує, вона викидає виняток, який зазвичай небажаний.
Філіп Кірнс

33
Я просто хотів зазначити, що якщо ви випадково оголосили змінну, яка перезаписує вбудовані команди, наприклад, type=… коли ви мали намір ввести type(…)потім видалення, це найпростіший спосіб повернути початковий функціонал. Тобто, якщо ви будете тримати його як "None", ви все одно будете відключати доступ до основної функції.
mpacer

1
Збір сміття / Колекціонер / Зібрано
mccc

1
Це я шукав. Граючи на лінії cmd, я мав ..., set = set(myList)а потім зрозумів, що більше не можу використовувати набір як функцію (doh). Використання del setдозволило мені знову використовувати його як fx. Звичайно, я ніколи не використовую цей зарезервований var у фактичному сценарії.
jbchurchill

111

var = None "очищає значення", встановлюючи значення змінної на "null", як значення "None", проте вказівник на змінну залишається.

del var повністю видаляє визначення змінної.

Якщо ви хочете використовувати змінну пізніше, наприклад, встановіть нове значення для неї, тобто збережіть змінну, Noneбуло б краще.


Що робити, якщо я хочу повністю видалити змінну, яка в деяких умовах не існує. Чи є якийсь параметр, щоб уникнути помилки? Мені потрібно видалити кілька змінних: del a, b, c, d Я міг би використовувати цикл і спробувати / крім, але я віддаю перевагу комутатору, щоб уникнути цього.
Тедо Врбанек

63

Власне, це не видаляє змінну / властивість. Все, що він буде робити, - це встановити його значення None, тому змінна все ще займе місце в пам'яті. Якщо ви хочете повністю стерти з пам'яті все існування змінної, ви можете просто ввести:

del self.left

8
Я не розумію, чому відповідь = None настільки популярна. Це правильна відповідь
Микола Громов

1
ОП сказала, що clearні remove. del знищить атрибут і пошуки. Це чистіше встановити його на None, ніж ви можете перевірити, if self.leftі це було б досить добре, щоб перевірити, чи вузол порожній.
користувач1767754

"Це чистіше встановити його на" Немає "- варто врахувати, що якщо хтось (сам через деякий час чи співпрацівець) читає код delIMHO, робить більш очевидним, що про цю змінну можна забути, коли" розумовий аналіз ' код.
Кишенькові та

1
@NikolayGromov у повсякденному коді, коли ви хочете отримати значення self.left, ви вважаєте за краще перевірити if self.left:, чи ви віддаєте перевагу можливим винятком NameError, який призведе до збою вашої програми, якщо ви не працюєте з нею скрізь ?
Pierre.Sassoulas

33
  • Якщо ви хочете повністю видалити його, використовуйте del:

    del your_variable

  • Або інакше, щоб зробити значенняNone :

    your_variable = None

  • Якщо це ітерабельний (наприклад, список чи кортеж), ви можете зробити його порожнім:

    your_variable.clear()

Тоді your_variableбуде порожньо


Для другого варіанту "очистити його вміст" невірно, це змінює лише перемінну зміну на "Немає", оригінальний об'єкт все одно залишиться (якщо тільки його посилання не зменшиться до нуля; у цьому випадку він збирається сміттям).
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

Важливо знати відмінності та встановити кілька обробників виключень, коли ви використовуєте встановлене значення "Немає". Якщо ви друкуєте значення умовних операторів за допомогою шаблону, скажімо,

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

ви можете побачити значення змінної друку "Значення змінної - Немає". Таким чином, вам доведеться помістити туди кілька обробників винятків:

if self.left:
    #Then only print stuff

Наведена вище команда друкує значення лише у тому випадку, якщо self.left не є None

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.