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
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
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).
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 :)
None
doesn't evaluate to False
. –
Upanishad bool(None)
–
Natale None
is not a boolean, which is why you need the bool
function to convert it (done implicitly by not
). Yes, I know it's a quibble but it's True
. –
Upanishad None
is a boolean, but it does evaluate to False
–
Natale None
is 'falsy'. –
Upanishad help(bool)
says "bool(x): Returns True when the argument x is true". But x
is true seems too similar to x is True
, which of course has a completely different meaning –
Natale 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'
It modifies the list in-place, and returns None
. None
evaluates to false.
Actually, it returns None
>>> print u.append(6)
None
>>> print not None
True
>>>
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.
builder()
pattern. It is one of the many reasons python is difficult to use. –
Silicious 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
© 2022 - 2024 — McMap. All rights reserved.
Builder
pattern .. so we can dou.append(6).append(7). ..
This is annoying. – Siliciousu.extend((6, 7))
? – Heelingappend()
andextend()
have different effects and are not interchangeable – Siliciousextend
. – Heeling