Почему пустой список оценивается как False в цикле while в Python - PullRequest
0 голосов
/ 18 октября 2018

Что представляет собой процесс, выполняемый циклом while для оценки False в пустом списке?

Например:

a=[1, 2, 3]
while a:
    a.pop()

По сути, я хочу знать, какой методили атрибут объекта списка, который проверяет while -loop, чтобы решить, следует ли прекратить или нет.

Ответы [ 4 ]

0 голосов
/ 18 октября 2018

Вы можете проверить, является ли список пустым, используя функцию bool ().Он оценивается как False, если переменная не существует или в случае списка, когда она пуста.

В вашем случае вы можете сделать это:

a=[1,2,3]

while bool(a) is True:
    a.pop()

Или даже проще:

a = [1,2,3]

while len(a) > 0:

    print(a.pop())
0 голосов
/ 18 октября 2018

Отличный вопрос!Он проверяет bool(a), который (обычно) вызывает type(a).__bool__(a).

. Python реализует определенные вещи, используя «магические методы».По сути, если у вас есть тип данных, определенный следующим образом:

class MyExampleDataType:
    def __init__(self, val):
        self.val = val

    def __bool__(self):
        return self.val > 20

Тогда этот код будет делать то, что выглядит так:

a = MyExampleDataType(5)
b = MyExampleDataType(30)

if a:
    print("Won't print; 5 < 20")
if b:
    print("Will print; 30 > 20")

Для получения дополнительной информации,см. документацию по Python: 3.3 Имена специальных методов .

0 голосов
/ 18 октября 2018

Условие типа if my_var эквивалентно if bool(my_var) и , эта страница объясняет это довольно хорошо:

Возвращаемое значение из bool ()

Bool () возвращает:

False, если значение опущено, или false True, если значение истинно

Следующие значения считаются ложными в Python:

Нет

False

Ноль любого числового типа.Например, 0, 0.0, 0j

Пустая последовательность.Например, (), [], ''.

Пустое сопоставление.Например, {}

объекты классов, которые имеют метод bool () или len () , который возвращает 0 или False

Все остальные значенияза исключением того, что эти значения считаются истинными.

0 голосов
/ 18 октября 2018

Циклы и условные выражения неявно используют bool на всех их условиях.Процедура подробно описана в разделе «Проверка истинности значения» документации.Для последовательности, подобной списку, это обычно заканчивается проверкой метода __len__.

bool работает следующим образом: сначала он пытается __bool__ метод.Если __bool__ не реализован, он проверяет, является ли __len__ ненулевым, и если это невозможно, просто возвращает True.

Как и при поиске всех магических методов, Python будет смотреть только накласс, а не экземпляр (см. Поиск специальных методов ).Если ваш вопрос о том, как изменить поведение, вам нужно будет создать подкласс.Присвоение отдельного метода замены словарю экземпляра не будет работать вообще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...