2016-01-05 2 views
-2

Я видел несколько ответов о том, как проверить, пуст ли список, но не нашел, что мне нужно. Вскоре - в python, мне нужно проверить, заполнен ли список, а затем удалить его, но мне нужно, чтобы проверка запускалась сразу после заполнения списка.в python, как проверить, не является ли список пустым, и пустым, если это так?

Я список по назвать мой класс определить - Packet()

class Packet(object): 
"""description of class""" 
    def __init__(self): 
     self.newPacket = [] 
newPacket = Packet() 

У меня есть меню, в котором один из вариантов является вызов функции в классе, чтобы заполнить список. , но если функция get выбрана снова, мне нужно очистить экземпляр и запустить новый. Я пытался сделать это:

if newPacket: 
    del newPacket 
newPacket.MakePacket() 

, но это не позвольте мне начать список, вызовите функцию .. если я отключить

if newPacket: 
    del newPacket 

функция работает просто отлично.

+5

Просто назначьте пустой список. – davidism

+2

Это не C, и вы не должны управлять удалением объектов. –

+0

, используя одно и то же имя 'newPacket' в примере для внутреннего списка и экземпляра класса, вводит в заблуждение. Вы спрашиваете, как удалить список, но вы удалите экземпляр класса. – furas

ответ

1

Возможно, вы сбиваете с толку конкретный экземпляр Packet, который вы создали и выбрали, чтобы назвать newPacket с его атрибутом с таким же именем. Вместо удаления экземпляра или даже удаления списка это похоже на то, что вы хотите очистить список. Поскольку вы указали две разные вещи на одно и то же имя, список, о котором идет речь, теперь доступен из вашей командной строки как newPacket.newPacket (хотя сам объект любит ссылаться на него в своих собственных методах как self.newPacket).

So. Когда вы del newPacket, вы удаляете ссылку на объект newPacket из текущего рабочего пространства. Затем интерпретатор поднимет NameError, если вы попытаетесь сделать что-либо с этим символом, например newPacket.MakePacket(), потому что эта переменная больше не существует в текущей рабочей области.

Если вы хотите реализовать Packet метод, которые учитываются элементы в атрибуте self.newPacket списка, или пустые, вы могли бы сказать:

class Packet(object): 

    # ... 

    def count(self): 
     return len(self.newPacket) 

    def clear(self): 
     del self.newPacket[:] 

Это кстати иллюстрирует один из способов разгрузки списка, сохраняя при этом ссылке в пустой список: del myList[:]

+1

его фактически просто уменьшает счетчик ссылок на один ... но это достаточно близко для меня: P –

+0

@JoranBeasley true; благодаря; изм. – jez

+0

узнать новые вещи. Спасибо! – ohad