Из документов Python, https://docs.python.org/3.6/library/stdtypes.html#truth-value-testing
Any object [of builtin type] can be tested for truth value,
for use in an if or while condition or as operand of the Boolean operations below.
By default, an object is considered true unless its class defines
either a __bool__() method that returns False or a __len__() method
that returns zero, when called with the object.
В нем перечислены различные встроенные объекты, которые считаются false
: None
, False
, 0
, [],
{} `.
Каждая переменная имеет value
, то есть ссылается на объект.В Python нет такой вещи как неинициализированная переменная.Вы получите NameError
, если попытаетесь использовать переменную, которая не была назначена.
None
является хорошим значением default
, например, в:
def foo(x, y=None):
if y is None:
y = 'a special value'
...
Массив numpy
не является встроенным типом и плохо работает с этим тестированием на истинность-значение.ndarray
всегда имеет значение.
Вот несколько случаев:
Массив из одного элемента независимо от размеров (0,1, ...) работает в if
:
In [73]: if np.array([0]): print('yes') # np.array(False), etc
In [74]: if np.array([1]): print('yes')
yes
Но многоэлементный массив будет выдавать ValueError независимо от значений:
In [75]: if np.array([1,2]): print('yes')
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-75-1212b980c1b6> in <module>()
----> 1 if np.array([1,2]): print('yes')
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Пустой массив (0 элементов) также является особым случаем:
In [77]: if np.array([]): print('yes')
/usr/local/bin/ipython3:1: DeprecationWarning: The truth value of an empty array is ambiguous. Returning False, but in future this will result in an error. Use `array.size > 0` to check that an array is not empty.
#!/usr/bin/python3
Это ValueError
подходитчасто на ТАК.Обычно это:
if x<0:
...
, где x
- массив.<
проверяет каждое значение и создает логический массив.numpy
вызывает эту ошибку, когда такой массив встречается в контексте, который ожидает скалярное логическое значение: if
, and
, or
.
Одна из возможностей - выполнить тест is None
с помощью:
if isinstance(y, np.ndarray):
<specialized array testing>
elif y:
<builtin False>
else:
<truthy>