Size: a a a

2021 November 28

SK

Sergio Keler in SPb Python
>>> l=[3,2,1]
>>> def d(z):
...     del z[1]
>>> print(l)
[3, 2, 1]
>>> d(l)
>>> print(l)
[3, 1]
источник

ЕД

Евгений Демидов... in SPb Python
Пока есть ссылки на объект, как только ссылок не будет, то сборщик подчищает
источник

SK

Sergio Keler in SPb Python
это тебе нельзя.
пока на объект хоть кто-то показывает, он есть.
источник

DS

David Shiko in SPb Python
А что делать тогда? Специальную структуру для удаления?
Подход правильный как я понимаю. Сейчас мне нужно удалить только 1 объект и список не нужен, но в будущем это легко может поменяться
источник

SK

Sergio Keler in SPb Python
если ты пишешь:

def fu(pa):
  va=pa

va перестанет существовать, как только ты выйдешь из fu
источник

SK

Sergio Keler in SPb Python
зачем?
поясни подробно. кусок кода покажи
источник

DS

David Shiko in SPb Python
Это я все знаю. Проблема мне понятна.
Интерпретатор питона  не знает, хочу я удалть оригинальный объект или элекмент списка, и удаляет последнее.
источник

DS

David Shiko in SPb Python
def end_conversation_handler(update: Update, context: CallbackContext):
   if not config.cancel_r.match(update.message.text):
       update = None  # If not none - user will be notified.
   if 'user' in context.user_data:
       return bot.end_conversation(update=update, objects_to_del=[context.user_data['user']])
   elif 'TargetUser' in context.user_data:
       return bot.end_conversation(update=update, objects_to_del=[context.user_data['TargetUser']])
   elif 'Post' in context.user_data:
       return bot.end_conversation(update=update, objects_to_del=[context.user_data['Post']])


def end_conversation(objects_to_del: list = None, update: Update = None, context=None) -> int:
   if update:
       update.message.reply_text(text='Галя, неси ключ, у нас отмена! Отменено.',
                                 reply_markup=tg_ReplyKeyboardRemove())
   for i in objects_to_del:
       del object_to_del  # Not working!
   return -1
источник

DS

David Shiko in SPb Python
Я еще не пробовал удалться не список, но что то мне подсказывает, что с передачей обхекта тоже выйдет лажа
источник

DS

David Shiko in SPb Python
Да, удаляется ссылка внутри ф-и, сам обхект живет
источник

ЕД

Евгений Демидов... in SPb Python
можно через слабые ссылки пошаманить
источник

ЕД

Евгений Демидов... in SPb Python
что-то вроде
источник

ЕД

Евгений Демидов... in SPb Python
import weakref


class obj_to_del:
   def __str__(self):
       return 'hi'

class generator:
   l = []

   @classmethod
   def create_obj(cls):
       cls.l.append(obj_to_del())
       return weakref.ref(cls.l[-1])

def delete(o):
   del generator.l[0]


def foo():
   o = generator.create_obj()
   delete(0)
   print(o)

foo()
источник

SK

Sergio Keler in SPb Python
А что мешает там и удалить?
context.user_data['Post']

Это список?
del context.user_data['Post'][блабла]
источник

DS

David Shiko in SPb Python
Ничего не мешает (кроме DRY), любопытство.
источник

SK

Sergio Keler in SPb Python
ну смотри,
ты сделал список object_to_del из списка context.user_data['Post']
то есть, на объекты теперь по две ссылки.
удаляя из object_to_del, ты удаляешь по одной ссылке из двух. то есть, в context.user_data['Post'] ничего не пропадёт и сами объекты тоже там не пропадут. ты же копию списка сделал и потом удалил... копию.
источник

DS

David Shiko in SPb Python
Да, уже понял
источник

SK

Sergio Keler in SPb Python
for d in object_to_del:
  del context.user_data['Post'][d]
источник

SK

Sergio Keler in SPb Python
ну хз... я уставший...
источник