Problem
Recently one of my colleague identified a bug in the Python application block. The issue was whenever any change done in a child list is also reflecting in the master list. On reviewing the code, we saw the child list was created by using list_child = list_master method. list = list should not be used to copy or clone. Doing so will not copy the contents of one list to another. Instead the child list will be a reference to the master list. So, any change in the child list will reflect the master list. Let’s see this with an example.
Example
In this example, I have initialized a list named list_master and assigned it to list_child. After removing some items from the list_child, check the list_master. You will see the same elements are removed from the list_master as well. This is because the list_child is just the reference to the list_master not a copy.
# initialize a master list
list_master = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020]
# assign master list to a child
list_child = list_master
# pring bith the lists
print("\nPrint master and the child list.")
print(list_child)
print(list_master)
# Remove some elements from the child list
list_child.remove(2010)
list_child.remove(2011)
list_child.remove(2012)
list_child.remove(2013)
# pring bith the lists
print("\nPrint master and the child list after removing some elements from child")
print(list_child)
print(list_master)
Result
Print master and the child list.
[2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020]
[2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020]
Print master and the child list after removing items from child
[2014, 2015, 2016, 2017, 2018, 2019, 2020]
[2014, 2015, 2016, 2017, 2018, 2019, 2020]
Solution
To avoid this problem you have to use the list.copy() method or the list() method or the copy.copy() method. Here are the examples.
(1) Using list.copy()
list_master = [2010, 2011, 2012, 2013]
# Copy the master list to a child
list_child = list_master.copy()
# Remove some elements from the child list
list_child.remove(2010)
list_child.remove(2011)
print(list_child)
print(list_master)
Result
[2012, 2013]
[2010, 2011, 2012, 2013]
(2) Using list()
import copy
list_master = [2010, 2011, 2012, 2013]
# Copy the master list to a child
list_child = copy.copy(list_master)
# Remove some elements from the child list
list_child.remove(2010)
list_child.remove(2011)
print(list_child)
print(list_master)
Result
[2012, 2013]
[2010, 2011, 2012, 2013]
Using list()
list_master = [2010, 2011, 2012, 2013]
# Copy the master list to a child
list_child = list(list_master)
# Remove some elements from the child list
list_child.remove(2010)
list_child.remove(2011)
print(list_child)
print(list_master)
Result
[2012, 2013]
[2010, 2011, 2012, 2013]
Reference
- about list on Python docs.
- More Python tips.