Skip to content
Home / Fundamentals

How to Pass a Variable by Reference in Python

In Python, variables are passed by reference, which means that when you pass a variable to a function, the function is able to modify the original variable. This can be useful in certain situations, but it can also lead to unexpected behavior if you're not aware of it.

Here's an example of how variables are passed by reference in Python:

def modify_list(lst):
  lst[0] = 'modified'

my_list = [1, 2, 3]
modify_list(my_list)
print(my_list)  # ['modified', 2, 3]

In this example, the modify_list function modifies the original my_list variable by changing the first element to the string 'modified'. This change is reflected in the original my_list variable after the function is called.

If you want to pass a variable to a function but don't want the function to be able to modify the original variable, you can use the copy module to create a copy of the variable before passing it to the function.

import copy

def modify_list(lst):
  lst[0] = 'modified'

my_list = [1, 2, 3]
modified_list = copy.copy(my_list)
modify_list(modified_list)
print(my_list)  # [1, 2, 3]
print(modified_list)  # ['modified', 2, 3]

In this example, the modified_list variable is a copy of my_list, so when the modify_list function modifies modified_list, it does not affect the original my_list variable.

Another way to pass a variable by reference in Python is to use the return statement to return the modified variable from the function.

def modify_list(lst):
  lst[0] = 'modified'
  return lst

my_list = [1, 2, 3]
modified_list = modify_list(my_list)
print(my_list)  # [1, 2, 3]
print(modified_list)  # ['modified', 2, 3]

In this example, the modify_list function returns the modified lst variable, which is then assigned to the modified_list variable. The original my_list variable is not modified.

You can also use the id() function to check the memory addresses of variables to confirm that they are different.

def modify_list(lst):
  lst[0] = 'modified'

my_list = [1, 2, 3]
modified_list = my_list

print(id(my_list))  # 42374488
print(id(modified_list))  # 42374488

modify_list(modified_list)
print(my_list)  # ['modified', 2, 3]
print(modified_list)  # ['modified', 2, 3]

my_list = [1, 2, 3]
modified_list = copy.copy(my_list)

print(id(my_list))  # 42374488
print(id(modified_list))  # 42374456

modify_list(modified_list)
print(my_list)  # [1, 2, 3]
print(modified_list)  # ['modified', 2, 3]

In this example, my_list and modified_list have different memory addresses, which means that they are separate variables and modifying one does not affect the other.