How does Python return multiple values from a function?
Whenever multiple values are returned from a function in python, does it always convert the multiple values to a list of multiple values and then returns it from the function? Is the whole process same as converting the multiple values to a list explicitly and then returning the list, for example in Java, as one can return only one object from a function in Java?
If you return two items from a function, then you are returning a tuple of length two, because that is how returning multiple items works. It’s not a list.
@khelwood: So, is it a special feature in python?? One which is not present in languages like JAVA, C++ .
@khelwood: So, actually it does not return multiple values but a tuple of multiple values. Am I right??
6 Answers 6
Since the return statement in getName specifies multiple elements:
def getName(self): return self.first_name, self.last_name
Python will return a container object that basically contains them.
In this case, returning a comma separated set of elements creates a tuple. Multiple values can only be returned inside containers.
Let’s use a simpler function that returns multiple values:
You can look at the byte code generated by using dis.dis , a disassembler for Python bytecode. For comma separated values w/o any brackets, it looks like this:
>>> import dis >>> def foo(a, b): . return a,b >>> dis.dis(foo) 2 0 LOAD_FAST 0 (a) 3 LOAD_FAST 1 (b) 6 BUILD_TUPLE 2 9 RETURN_VALUE
As you can see the values are first loaded on the internal stack with LOAD_FAST and then a BUILD_TUPLE (grabbing the previous 2 elements placed on the stack) is generated. Python knows to create a tuple due to the commas being present.
You could alternatively specify another return type, for example a list, by using [] . For this case, a BUILD_LIST is going to be issued following the same semantics as it’s tuple equivalent:
>>> def foo_list(a, b): . return [a, b] >>> dis.dis(foo_list) 2 0 LOAD_FAST 0 (a) 3 LOAD_FAST 1 (b) 6 BUILD_LIST 2 9 RETURN_VALUE
The type of object returned really depends on the presence of brackets (for tuples () can be omitted if there’s at least one comma). [] creates lists and <> sets. Dictionaries need key:val pairs.
To summarize, one actual object is returned. If that object is of a container type, it can contain multiple values giving the impression of multiple results returned. The usual method then is to unpack them directly:
>>> first_name, last_name = f.getName() >>> print (first_name, last_name)
As an aside to all this, your Java ways are leaking into Python 🙂
Don’t use getters when writing classes in Python, use properties . Properties are the idiomatic way to manage attributes, for more on these, see a nice answer here.
Moreover, getThis and setThat are obsolete hold-overs from the Java bean days. I would like to see an end to this paradigm once and for all. object.foo() implies a «get» and object.foo(value) already implies a set.
Although it looks like myfun() returns multiple values, a tuple is actually being created. It looks a bit peculiar, but it’s actually the comma that forms a tuple, not the parentheses
So yes, what’s going on in Python is an internal transformation from multiple comma separated values to a tuple and vice-versa.
Though there’s no equivalent in java you can easily create this behaviour using array ‘s or some Collection s like List s:
private static int[] sumAndRest(int x, int y)
public static void main(String[] args) < int[] results = sumAndRest(10, 5); int sum = results[0]; int rest = results[1]; System.out.println("sum = " + sum + "\nrest mt24"> )" data-controller="se-share-sheet" data-se-share-sheet-title="Share a link to this answer" data-se-share-sheet-subtitle="" data-se-share-sheet-post-type="answer" data-se-share-sheet-social="facebook twitter devto" data-se-share-sheet-location="2" data-se-share-sheet-license-url="https%3a%2f%2fcreativecommons.org%2flicenses%2fby-sa%2f3.0%2f" data-se-share-sheet-license-name="CC BY-SA 3.0" data-s-popover-placement="bottom-start">Share )" title="">Improve this answer )">edited Jul 10, 2017 at 17:49 Dimitris Fasarakis Hilliard 150k 31 gold badges 265 silver badges 251 bronze badges answered Sep 6, 2016 at 9:59 jocjoc 1,336 12 silver badges 30 bronze badges