ADBlock is blocking some content on the site # Shuffling Parameters

### Question

I'm a begginer in Python, and I was reading a book.

So this is a funcion that imitates range()

``````def interval(start, stop=None, step=1):
'Imitates range() for step > 0'
if stop is None:
start, stop = 0, start      # How is this evaluated?
result = []
i = start
while i < stop:
result.append(i)
i += step
return result
``````

My question here is: How is evaluated the:

`start, stop = 0, start` part?

Because I understand that the parameters should evaluate like this:

`5, stop = 0, 5` (I know I'm wrong but I need you to tell me how is this part evaluated)

### Solution

The form

``````x, y = a, b
``````

is a multiple assignment which is well (but obtusely) documented. The simple example I gave would be equivalent to

``````x = a
y = b
``````

or in the case of your example `start, stop = 0, start`

``````stop = start
start = 0
``````

Notice how I reordered the assignments; this is one advantage of multiple assignment. In this case you'd have to add a temporary variable if you wanted the same effect:

``````temp = start
start = 0
stop = temp
``````

### OTHER TIPS

If you call `interval( 10 )`, then `start = 0` and `stop = 10`. When `interval( 5, 10 )` is called, then `start = 5` and `stop = 10`.

`start, stop = 0, start` is equivalent to `stop = start; start = 0`.

a, b = c, d is equivalent to a = c and b = d

This is called tuple unpacking.

``````In : x,y = 0,1

In : print(x)
0

In : print(y)
1
``````

You can do this for any sequence. In the above, you are in-line specifying a tuple with (0,1). You can also unpack, say, an iterable:

``````In : a,b,c = range(3)

In : a
Out: 0

In : b
Out: 1

In : c
Out: 2
``````

but you have to make sure that the number of arguments you provide to unpack makes sense.

``````In : a,b = range(3)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/home/ben/<ipython-input-32-ec703b8346af> in <module>()
----> 1 a,b = range(3)

ValueError: too many values to unpack (expected 2)

In : a,b,c,d = range(3)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/home/ben/<ipython-input-33-16ef42f82877> in <module>()
----> 1 a,b,c,d = range(3)

ValueError: need more than 3 values to unpack
``````

Note that (and this is the part that seems to be confusing you) the right side is evaluated before the left side. This allows for the common idiom:

``````In : x = 0

In : y = 1

In : x,y = y,x
``````