Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Appending to a list comprehension in Python returns None

This is a question out of curiosity rather than trying to use it for a practical purpose.

Consider I have the following simple example where I generate a list through list comprehension:

>>> a = [1, 2, 3]
>>> b = [2 * i for i in a]
>>> b
[2, 4, 6]
>>> b.append(a)
>>> b
[2, 4, 6, [1, 2, 3]]

However if I try and do this all in one action

>>> a = [1, 2, 3]
>>> b = [2 * i for i in a].append(a)
>>> b == None
True

The result returns None. Is there any reason why this is the case?

I would have thought that an action like this would either return an answer like in the first example or throw an error.

For reference I'm using Python 3.6.5

like image 848
ScottMcC Avatar asked Jun 27 '18 03:06

ScottMcC


3 Answers

append only works on variables, not list literals, since it updates the list object itself and does not return the resulting list.

As @Tomalak mentioned noted, running a similar operation on a simple list also returns None

>>> [1, 2, 3].append(4) == None
True
like image 91
blhsing Avatar answered Sep 28 '22 00:09

blhsing


You can use concatination + instead of append in list comprehension

In [1]: a = [1, 2, 3]

In [2]: b = [2 * i for i in a] + [a]

In [3]: b
Out[3]: [2, 4, 6, [1, 2, 3]]
like image 38
Nidhin Sajeev Avatar answered Sep 27 '22 22:09

Nidhin Sajeev


@ScottMcC, methods defined on mutable objects like list, dictionary mostly perform operations on calling object and doesn't return anything.

In case of immutable object like string you may see, methods return the modified form(a different object) of the calling object. In case of list, it's different.

You can't expect the below operations on list kind of mutable objects.

s = "hello DJANGO"
s2 = s.upper() 
s3 = s.lower() 

print(s)  # hello DJANGO
print(s2) # HELLO DJANGO
print(s3) # hello django

Now, have a look at the below examples.

list is mutable object.

Calling sort() method on list directly modified the calling object and doesn't return anything (That's why None).

Calling sorted() function doesn't alter the passing list. It creates a separate sorted list based on the passed list. As it is not a method defined on list object, it returns the new sorted list.

append() method appends item on the calling list and doesn't return anything. Once you call it, you are done with updating (appending an item) the list.

# sort() method defined on list updates the calling list
# As it updates current list, it doesn't return anything. That's why None.
a = [5, 8, 1, 2, 7]
n = a.sort()
print (a)
print(n)
print ()

# sorted() function returns a new sorted list 
# It doesn't update the calling list a2 
a2 = [5, 8, 1, 2, 7];
n = sorted(a2);
print (a2)
print(n)
print()

# append() is method defined on list, it updates calling list so it doesn't return anything (None)
l = []
n = l.append(34)
print(l)
print (n)

Output

[1, 2, 5, 7, 8]
None

[5, 8, 1, 2, 7]
[1, 2, 5, 7, 8]

[34]
None
like image 40
hygull Avatar answered Sep 27 '22 22:09

hygull