Различие между dict.clear () и присваивающийся {} в Python

Примечание: Неопределенный индекс

Случается, когда вы пытаетесь получить доступ к массиву с помощью ключа, который не существует в массиве.

Типичным примером для уведомления Undefined Index будет ( demo )

$data = array('foo' => '42', 'bar');
echo $data['spinach'];
echo $data[1];

Оба spinach и 1 не существуют в массив, вызывающий запуск E_NOTICE .

Решение состоит в том, чтобы убедиться, что индекс или смещение существуют до доступа к этому индексу. Это может означать, что вам необходимо исправить ошибку в вашей программе, чтобы убедиться, что эти индексы существуют, когда вы ожидаете их. Или это может означать, что вам нужно проверить, существуют ли индексы с помощью array_key_exists или isset :

$data = array('foo' => '42', 'bar');
if (array_key_exists('spinach', $data)) {
    echo $data['spinach'];
}
else {
    echo 'No key spinach in array';
}

Если у вас есть код например:


...

, тогда $_POST['message'] не будет установлена, когда эта страница будет загружена первой, и вы получите указанную выше ошибку. Только когда форма будет отправлена ​​и этот код будет запущен во второй раз, будет существовать индекс массива. Вы обычно проверяете это с помощью:

if ($_POST)  ..  // if the $_POST array is not empty
// or
if ($_SERVER['REQUEST_METHOD'] == 'POST') ..  // page was requested with POST

Вопросы, относящиеся:

159
задан Michael Hoffman 8 December 2011 в 01:14
поделиться

3 ответа

Если у Вас есть другая переменная, также обращающаяся к тому же словарю, существует большая разница:

>>> d = {"stuff": "things"}
>>> d2 = d
>>> d = {}
>>> d2
{'stuff': 'things'}
>>> d = {"stuff": "things"}
>>> d2 = d
>>> d.clear()
>>> d2
{}

Это вызвано тем, что присвоение d = {} создает новый, пустой словарь и присваивает его d переменная. Это уезжает d2 указание на старый словарь с объектами все еще в нем. Однако d.clear() очищает тот же словарь что d и d2 обе точки в.

272
ответ дан Greg Hewgill 23 November 2019 в 21:34
поделиться

d = {} создаст новый экземпляр для d, но все другие ссылки будут неподвижная точка к старому содержанию. d.clear() сбросит содержание, но все ссылки на тот же экземпляр все еще будут корректны.

29
ответ дан vaultah 23 November 2019 в 21:34
поделиться

В дополнение к различиям, упомянутым в других ответах, также существует разность оборотов. d = {} более чем вдвое более быстро:

python -m timeit -s "d = {}" "for i in xrange(500000): d.clear()"
10 loops, best of 3: 127 msec per loop

python -m timeit -s "d = {}" "for i in xrange(500000): d = {}"
10 loops, best of 3: 53.6 msec per loop
21
ответ дан odano 23 November 2019 в 21:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: