Copying and flipping#
We saw earlier that modifying the 2D list image in the function modified rgb_square
. We can solve this by making a copy of the image and returning the copy.
Below is the modified version of flip_left_right
. Notice that we have changed the function to first make a copy of img
. Instead of modifying img
, we modified copy_img
and returned copy_img
which will prevent our original img
from being modified.
Our updated code prints the following. Notice that the argument, rgb_square
, remained the same after we called the function and the new variable, rgb_square_flipped
, stores the return of flip_left_right(rgb_square)
.
rgb_square before flip_left_right = [[(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)]]
rgb_square after flip_left_right = [[(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)]]
rbg_square_flipped = [[(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)]]
Why did this work? In the previous lesson, we learned that img
and rgb_square
are actually references to the same object. By creating a copy of img
, we have created a new 2d list object that contains the same elements as img
. Now, copy_img
references this new object. When we return copy_img
, rgb_square_flipped
will contain the same reference as copy_img
; hence, rbg_square_flipped
will reference the new object that was created in the function.
Keep in mind that copy_img
and img
are local variables to flip_left_right
and only exist within the function. We cannot access copy_img
and img
outside of flip_left_right
.
Optimization: copy on-the-fly#
Our code above copies and then flips. We could work differently, copying on the fly:
Notice how we avoid a lot of work: we don’t have to initialize copy_img
up front; we don’t have to worry about temporary variables or stopping in the middle. It’s often much easier to write copying code than to do things in place!