Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/64: Рейтинг темы: голосов - 64, средняя оценка - 4.72
7 / 7 / 0
Регистрация: 05.04.2016
Сообщений: 410

Удаление объекта

12.05.2018, 19:34. Показов 12917. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, господа.
Больно в гугле велики расхождения ответов на данный вопрос, потому переадресовываю его вам: можно ли как-либо удалить в питоне экземпляр объекта так, что бы все ссылки на него (которых может быть сотни из разных кусков проекта) стали None (и он сам в памяти пропал, что бы gc собрал его компоненты, на которые больше никто не ссылался)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.05.2018, 19:34
Ответы с готовыми решениями:

Удаление объекта класса в конструкторе
Приветствую, форумчане! Мне необходимо при определённых условиях возвращать из конструктора None вместо объекта. Атрибуты класса удаляю...

Удаление объекта класса
Подскажите пожалуйста какую команду и как использовать в python для выполнения следующих действий: Есть некоторый класс. Я создаю...

Произойдёт ли удаление объекта без вызова term?
from django.db import models import datetime from django.utils import timezone class Question(models.Model): ...

10
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
12.05.2018, 21:45
Цитата Сообщение от Nordicus666 Посмотреть сообщение
которых может быть сотни
Каким образом вы считали?
Существует два способа это сделать: просто предположить и использовать специальную функцию для подсчета.
Почему вы думаете что их нужно удалить?
Если объект никем не используется и его счетчик ссылок достиг нуля - будет произведено удаление по decref.
Если на объект существует циклическая ссылка и на него нет внешних ссылок (только внутренние) - gc разрулит это сам с помощью cycle finder. В крайнем случае объект уйдет в garbage контейнер.
Если объект используется, а вы все-таки хотите его удалить - вы хотите странного.

Инструменты очистки памяти для тяжелых случаев плохо написанного кода:
1) gc.collect()
2) слабые ссылки (weakref)
3) увеличение порогового значения (sys.set_threshold) для объектов нулевого поколения: чтобы gc срабатывал чаще.
0
7 / 7 / 0
Регистрация: 05.04.2016
Сообщений: 410
13.05.2018, 11:17  [ТС]
у меня крупный проект, а именно: 3д движок по мотивам юнити (похожая структура), следовательно, допустим, имеется объект в мировом пространстве, а на него есть десяток ссылок из каких-либо скриптов в других объектах, а так же одна ссылка как минимум из списка объектов мира, так вот в одном из скриптов мне нужно его удалить, при том удалить так, что бы удалилась не ссылка из того скрипта на него, а сам объект пропал и ВСЕ ссылки на него у всех стали None
Мультипроцессорности у меня нет, так что в процессе удаления объект не может использоваться
0
757 / 306 / 190
Регистрация: 20.05.2016
Сообщений: 593
13.05.2018, 11:57
Питон так устроен, что вы не можете удалить непосредственно объект, или обнулить счетчик ссылок на него (исключая, возможно, один очень нехороший способ). Если счетчик ссылок не равен нулю, значит объект используется, и его неожиданное исчезновение повлечет за собой неприятные последствия вроде проброса (произвольного) исключения.

Можно попытаться подменить объект мягкоссылочной проксей - weakref.proxy / weakref.ref, однако, есть неудобные побочные эффекты, вроде необходимости писательства скобок всюду, где используется ref, или проброса исключения ReferenceError, если объект на который ссылается proxy больше не существует.
пример weakref
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import weakref
import sys
 
 
def callback(weakproxy):
    print("CALLBACK")
 
 
class O:
    pass
 
 
oo = O()
 
print('refcount', sys.getrefcount(oo) - 1)
 
po = weakref.proxy(oo, callback)
ro = weakref.ref(oo)
# далее вместо oo везде используем po или ro
 
print('refcount', sys.getrefcount(oo) - 1)
 
print(ro())
print(po)
 
del oo
 
print(ro())
print(po)


Или Вы, возможно, что-то иное подразумевете под ссылками, и мы вас не понимаем?..
0
7 / 7 / 0
Регистрация: 05.04.2016
Сообщений: 410
13.05.2018, 12:01  [ТС]
Что такое ссылка я вполне понимаю и ничего уникального не подразумеваю
Что ж, всё таки оказались верны те ответы гугла, которые говорили, что так сделать в питоне невозможно.. печально, значит будет ненадёжное удаление..
а про weakref'ы почитаю для профилактики, просто не вариант переписывать мой проект под подобную структуру, когда завтра дедлайн)
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
13.05.2018, 12:42
Цитата Сообщение от Nordicus666 Посмотреть сообщение
печально, значит будет ненадёжное удаление.
То есть вы все-таки хотите странного?
Python не СИ - он все делает за ВАС в плане управления памятью.
Если объект в какой-то момент выполнения кода вам становится не нужным - вы просто делаете del объект и все: привязка объекта к имени переменной удаляется из данного namespace, а счетчик ссылок на объект уменьшается на единицу, при нулевом числе ссылок память занимаемая объектом автоматически деаллоцируется.
0
7 / 7 / 0
Регистрация: 05.04.2016
Сообщений: 410
13.05.2018, 14:23  [ТС]
Да эти вещи я и так понимаю, я искал способ обойти механику питона и именно удалить объект, т.е. что бы все ссылки на него занулились
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
13.05.2018, 14:35
Механику Python не нужно обходить - нужно просто писать python way код и делать грамотную архитектуру проекта.
Все остальное python сделает за вас.
Для удаления объектов (с удалением привязки к имени) существует единственный нормальный способ: del obj.
То что хотите вы - даже в СИ не делается, поскольку ручное управление подразумевает немедленную деаллокацию ненужной переменной самим программистом в том месте, где она была определена.
0
1 / 0 / 1
Регистрация: 23.05.2022
Сообщений: 2
23.05.2022, 16:13
Лучший ответ Сообщение было отмечено Notrum666 как решение

Решение

То, что в python нельзя гарантировано удалить экземпляр объекта вручную мне кажется не совсем правда. Да, сборщик мусора будет тупить пока существуют ссылки на экземпляр объекта, но кто сказал, что нельзя занулить сам экземпляр и тогда ссылки на него исчезнут.
Пример рабочего кода:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/usr/bin/python2.7
import threading
import time
import sys
 
class f():
 
    num = 0
    stop = 0
    threads = []
        
    def __init__(self, _num):
        self.num = _num
        print(str(self.num)," created")
        self.threads.append(threading.Thread(target=self.listen, name="audio", args=()))
        self.threads.append(threading.Thread(target=self.listen, name="video", args=()))
        
        
    def listen(self):
        while stop == 0:
            print (self.num)
            time.sleep(2)
    
    def stop(self):
        self.stop = 1
        stop_flag = len(self.threads)
        print(str(self.num)," closing...")
        while stop_flag > 0:
            for th in self.threads:
                if not th.is_alive():
                    stop_flag -= 1
                    del th
                else:
                    print(str(self.num)," thread named " + th.getName() + " still alive!")  
 
        self.threads.clear()
        self.threads = None
        
        del self    
        
    def __del__(self):
        print("Avaible links to this object: " + str(sys.getrefcount(self)))
        print("Object destroyed")
        
pipes = []
        
for i in range(0,5):
    pipes.append(f(i))
 
print("Deleting objects...")
for x in range(len(pipes)-1, -1, -1):
    pipes[x].stop()
    del pipes[x]
    
print ("Now pipes: ", len(pipes))       
print("2 seconds to terminate...")      
 
for i in range(0,2):
    time.sleep(1)
 
print ("Now pipes: ", len(pipes))
Тут мы создаем сложные экземпляры объектов, которые тормозят собственное удаление рабочими потоками. Однако, если запустить код можно увидеть, что они удаляются не по причине завершения скрипта, а по нашему вызову, что соответствует нашей задаче.
Profit, please!
0
1 / 0 / 1
Регистрация: 23.05.2022
Сообщений: 2
23.05.2022, 16:38
Вот результат работы кода
Миниатюры
Удаление объекта  
0
7 / 7 / 0
Регистрация: 05.04.2016
Сообщений: 410
23.05.2022, 22:26  [ТС]
удивительно, теме 4 года, а на неё ещё отвечают..
я уже 4 года с питоном не работаю, так что не особо вникаю что тут происходит, но пусть будет ответом, наверн
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.05.2022, 22:26
Помогаю со студенческими работами здесь

Удаление объектов из списка и удаление самого объекта
Здраствуйте! Возник такой вопрос, допустим имеется структура данных (неважно, будь то словарь или список, пусть в данном случае будет...

Удаление объекта
Добрый вечер! Я бы хотел уточнить. Если у нас есть такая структура, class A{ private: public: A(); ~A(); };

Удаление объекта
class My{} public static void Main(){ My o = new My(); } как удалить объект о?

Удаление объекта ef 6.0
Добрый день! У меня есть 2 класса, которые имеют связь один ко многим, есть бд, использую entity fraemwork 6.0 сущности такие: ...

Удаление объекта
Здравствуйте , у меня такой вопрос есть Элемент например Кнопка id="btn1" , Эта кнопка находится в родительском элементе div который...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru