# Defining a function for flip#

Now that we have flawless code that flips an image, let’s create a function so that the transformation can be utilized repeatedly on many images. Define our function as `flip_left_right` and let it take `img` as its parameter. Then, bring the nested `for` loops that we already completed in Step 3 into the body part of the `flip_left_right` function as follows.

```def flip_left_right(img):
for y in range(len(img)):
for x in range(len(img[y])//2):
temp = img[y][x]
img[y][x] = img[y][len(img[y])-x-1]
img[y][len(img[y])-x-1] = temp
```

In order to validate the code, let’s use the following example as our test.

```rgb_square =[[(255,0,0),(0,255,0), (0,0,255)],
[(255,0,0),(0,255,0), (0,0,255)],
[(255,0,0),(0,255,0), (0,0,255)]]
```

Note that the first elements of inner lists are all red, the second elements of inner lists are all green, and the third elements of inner lists are all blue. Thus, `rgb_square` represents the following image.

In order to use `rgb_square` as our test sample to the `flip_left_right` function, we run the following lines.

```flip_left_right(rgb_square)
```

Then, here is the output, as we wanted!

```>>> rgb_square
[[(0, 0, 255), (0, 255, 0), (255, 0, 0)],
[(0, 0, 255), (0, 255, 0), (255, 0, 0)],
[(0, 0, 255), (0, 255, 0), (255, 0, 0)]]
```

Our `flip_left_right` function works well for the given test sample `rgb_square`.

Now, focus on the fact that the `flip_left_right` function does not have any `return` statement.

```def flip_left_right(img):
for y in range(len(img)):
for x in range(len(img[y])//2):
temp = img[y][x]
img[y][x] = img[y][len(img[y])-x-1]
img[y][len(img[y])-x-1] = temp
```

It means the `flip_left_right` function returns `None` no matter what `img` is. Then, how does our code work well although the function returns nothing? Recall that a reference is a name that refers to the location/address of a value in memory, and that the referred value is called an object. When you assign a list to a variable, what it actually does is to assign the variable with a reference that points to the list. Passing the argument `rgb_square` as parameter img into the `flip_left_right` function,

```flip_left_right(rgb_square)
```

does not create copies of every pixel value that `rgb_square` is associated with, but it rather passes a reference to the object. Therefore, the variable `img` in the scope of `flip_left_right` function is another reference to the same object as `rgb_square`. Any execution that handles with the reference `img` in the scope of `flip_left_right` function automatically modifies pixel values of the object, which is why `rgb_square` is altered the way we desired.