Как вернуть логическое значение для определения того, имеет ли список определенный размер?

#python-3.x #list #boolean

#python-3.x #Список #логическое

Вопрос:

Я решаю проблему с leetcode, в которой мне нужно спроектировать циклическую структуру. Одна из функций — проверить, является ли текущий контейнер (я использую список) пустым, и вернуть логическое значение. Первый способ, о котором я подумал, был: return cur_list is None но иногда он дает неправильный ответ по сравнению с заданным ответом. затем я перешел к использованию: return len(cur_list)==0 и это работает нормально. Как это происходит? Разве они не одинаковы?

Комментарии:

1. Мне очень жаль. Заголовок этого вопроса должен быть «как вернуть логическое значение для определения того, является ли список пустым», я допустил ошибку и не знаю, как отредактировать его после публикации.

2. Нет, это абсолютно не одно и то же. cur_list is None проверяет , является ли cur_list это тем же самым объектом , None что и . len(cur_list)==0 проверяет, имеет ли список длину ровно 0

Ответ №1:

Они определенно не совпадают. В Python строки,

 foo is bar
id(foo) == id(bar)
 

эквивалентны.

Если вы читаете документы для id https://docs.python.org/3/library/functions.html#id , вы увидите, что использование is ключевого слова буквально проверяет, совпадают ли два объекта.

Вы должны использовать is ключевое слово только для проверки, есть ли объект None . Это связано с тем, что для повышения производительности Python создает один None объект при запуске, который затем используется всякий раз, когда создается переменная None . Итак, если две переменные есть None , то они будут буквально одним и тем же объектом и foo is bar будут True .

Поскольку пустой список [] , безусловно, отличается от объекта None , для проверки, является ли список пустым, вы обязательно должны сделать len(cur_list)==0

Комментарии:

1. Теперь я понял, большое спасибо.

Ответ №2:

Это не одно и то же.

Список — это объект Python, который может быть пустым. Например, список с ненулевым числом элементов будет выглядеть примерно так

 my_list = [1, 2, 3]
 

Однако список без элементов (который на самом деле все еще является объектом списка) будет выглядеть так

 my_empty_list = []
 

Что отличается от объекта NoneType в Python:

 my_none_obj = None
 

А именно, обратите внимание на это [] != None . Один из способов подумать об этом — это None в некотором смысле сообщить вам, что ваша переменная вообще не указывает на список. None идентифицируется, но отличается от пустой структуры данных.

Комментарии:

1. «по сути, это нулевой указатель» на самом деле не лучший способ думать об этом, если вы не пришли из C. Даже тогда, не очень хорошая аналогия.

2. Спасибо за ваше объяснение, теперь я понял.

3. @juanpa.arrivillaga полностью согласен — вот почему я сказал, что это не совсем точно, и сделал оговорку, что я сделал это сравнение, потому что None может использоваться, когда есть переменная, которую мы считаем списком, но на самом деле указывает на объект None, а не на пустой список. Несмотря на это, я согласен, что это плохая аналогия, и я соответствующим образом отредактировал свой ответ.