#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, а не на пустой список. Несмотря на это, я согласен, что это плохая аналогия, и я соответствующим образом отредактировал свой ответ.