Appending to a list comprehension in Python returns None

蓝咒 提交于 2021-02-01 21:00:04

问题


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


回答1:


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



回答2:


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]]



回答3:


@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


来源:https://stackoverflow.com/questions/51054183/appending-to-a-list-comprehension-in-python-returns-none

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!