(Note that neither “and” nor “or” restrict the value and type they return to “False” and “True”, but rather return the last evaluated argument. This is sometimes useful, e.g., if “s” is a string that should be replaced by a default value if it is empty, the expression “s or ‘foo’” yields the desired value. Because “not” has to invent a value anyway, it does not bother to return a value of the same type as its argument, so e.g., “not ‘foo’” yields “False”, not “‘’”.)