34
votes

Is there a reason being list.append evaluating to false? Or is it just the C convention of returning 0 when successful that comes into play?

>>> u = []
>>> not u.append(6)
True
7
A possibly better way to phrase: why does python not use the Builder pattern .. so we can do u.append(6).append(7). .. This is annoying. - WestCoastProjects
@javadba Why not just do u.extend((6, 7))? - Stefan Pochmann
@Stefan append() and extend() have different effects and are not interchangeable - WestCoastProjects
@javadba What difference? My extend has the same effect as your two appends. - Stefan Pochmann
extend() retains a single list if the elements were a list whereas append() will be a list of lists. In the above case they are not so it's a special case that does end up the same between extend() and append(). - WestCoastProjects

7 Answers

42
votes

Most Python methods that mutate a container in-place return None -- an application of the principle of Command-query separation. (Python's always reasonably pragmatic about things, so a few mutators do return a usable value when getting it otherwise would be expensive or a mess -- the pop method is a good example of this pragmatism -- but those are definitely the exception, not the rule, and there's no reason to make append an exception).

21
votes

None evaluates to False and in python a function that does not return anything is assumed to have returned None.

If you type:

>> print u.append(6)
None

Tadaaam :)

6
votes

because .append method returns None, therefore not None evaluates to True. Python on error usually raises an error:

>>> a = ()
>>> a.append(5)
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    a.append(5)
AttributeError: 'tuple' object has no attribute 'append'
5
votes

It modifies the list in-place, and returns None. None evaluates to false.

3
votes

Actually, it returns None


>>> print u.append(6)
None
>>> print not None
True
>>> 

1
votes

Method append modifies the list in-place and the return value None

In your case, you are creating an array — [6] — on the fly, then discarding it. The variable b ends up with the return value of None.

Why?
This comply with the principle of Command–query separation devised by Bertrand Meyer.
It states that every method should either be a command that performs an action, or a query that returns data to the caller, but not both. In your example:

u.append(6)

append modified the state of [], so it’s not a best practice to return a value compliance with the principle.

In theoretical terms, this establishes a measure of sanity, whereby one can reason about a program's state without simultaneously modifying that state.

CQS is well-suited to the object-oriented methodology such as python.

0
votes

The list.append function returns None. It just adds the value to the list you are calling the method from.

Here is something that'll make things clearer:

>>> u = []
>>> not u
False
>>> print(u.append(6)) # u.append(6) == None
None    
>>> not u.append(6) # not None == True
True