Проблема заключается в том, что NaN не равен самому себе, как определено в стандарте IEEE для чисел с плавающей запятой:
>>> float("nan") == float("nan")
False
Когда словарь ищет ключ, он примерно делает это:
is
, ключ был найден. б. Если первая проверка не удалась, проверьте равенство, используя оператор __eq__
. Первый пример завершается успешно, так как np.nan
и np.nan
являются одним и тем же объектом, поэтому это не имеет значения они не сравниваются с равными:
>>> numpy.nan is numpy.nan
True
Во втором случае np.float64(np.nan)
и np.float64(np.nan)
не являются одним и тем же объектом - два вызова конструктора создают два разных объекта:
>>> numpy.float64(numpy.nan) is numpy.float64(numpy.nan)
False
Поскольку объекты также не сравниваются одинаково, словарь завершает, что ключ не найден и выбрасывает KeyError
.
Вы даже можете сделать это:
>>> a = float("nan")
>>> b = float("nan")
>>> {a: 1, b: 2}
{nan: 1, nan: 2}
В заключение, кажется, более разумная идея избегать NaN в качестве словарного ключа.
Хотя исправление функции изменения так, что она вызывается для выбора, а не для опции, важно, ваша проблема - сама выбранная опция по умолчанию. Как вы упомянули, если им нужен первый вариант, им нужно выбрать что-то еще, чтобы вызвать функцию изменения.
Я бы порекомендовал добавить «пустую» опцию в качестве первой опции и установить ее как выбранную.
var $select_ex = $("#select_ex");
.done(result){
$select_ex.empty().append("<option value='0'>Select Your Ex Below!</option>");
$.each(result.data,function (){
$select_ex.append("<option value...... ></option>");
});
$select_ex.val("0");
}
$select_ex.change(function_2);