Python Forum
Why does pop() removes an element from more than one list?
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Why does pop() removes an element from more than one list?
#1
I have just started using python and encountered this problem. I made list2 a copy of list1. When I remove the last element ("b") in list2 using list2.pop(), the same thing happens to list1 at the same time (which was not intended). Are list1 and list2 somehow 'entangled'?? What should I do if I want to make such changes to one of the lists only?

I know this might be a silly question but still please help :)

list1 = ["a","b"]
list2 = list1
print("list1 = ", list1)
list2.pop()
print("list1 = ", list1)
Reply
#2
After the statement list2 = list1, the two lists are the very same object. In fact there is only one list with two names, list1 and list2. The statement simply creates a new name for the object currently named list1. If you want a new object, make a copy
list2 = list(list1)
Reply
#3
(Nov-16-2019, 04:52 PM)albufork Wrote: I made list2 a copy of list1.
Actually list1 and list2 point to same object. the assignment just copies the reference to the list, not the actual list, so both list1 and list2 refer to the same list after the assignment.
to make a copy of list use

list2 = list1.copy()
or

list2 = list1[:]
you can also use copy.copy() and copy.deepcopy() from copy module
If you can't explain it to a six year old, you don't understand it yourself, Albert Einstein
How to Ask Questions The Smart Way: link and another link
Create MCV example
Debug small programs

Reply
#4
Thank you, Gribouillis and buran! The problem is now solved!

Now I understand that list1 and list2 point to the same object. Is this the case only in defining a new list but not other instances of objects?
Reply
#5
albufork Wrote:Is this the case only in defining a new list but not other instances of objects?
It is the same for all python objects. The effect of the statement spam = eggs is that from now on, the word spam refers to the object that is currently referred to by the name eggs. No new object is created by this statement.
Reply
#6
In addition, the effect you see on list is because lists are mutable objects. i.e. when you append, pop, etc. it's still the same object, so the change is "visible" in all names that refer to same object. Same will apply to any mutable objects, e.g. dicts
>>> spam = {1:'a', 2:'b'}
>>> eggs = spam
>>> spam[3] = 'c'
>>> spam
{1: 'a', 2: 'b', 3: 'c'}
>>> eggs
{1: 'a', 2: 'b', 3: 'c'}
just for example, strings on other hand are immutable. i.e. you cannot change the object
>>> spam = 'foo'
>>> eggs = spam
>>> id(spam)
140509962431992
>>> id(eggs)
140509962431992
>>> spam = spam + 'bar'
>>> spam
'foobar'
>>> eggs
'foo'
>>> id(spam)
140509962432160
>>> id(eggs)
140509962431992
If you can't explain it to a six year old, you don't understand it yourself, Albert Einstein
How to Ask Questions The Smart Way: link and another link
Create MCV example
Debug small programs

Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  list in dicitonary element problem jacksfrustration 3 626 Oct-14-2023, 03:37 PM
Last Post: deanhystad
  Find (each) element from a list in a file tester_V 3 1,157 Nov-15-2022, 08:40 PM
Last Post: tester_V
  Сheck if an element from a list is in another list that contains a namedtuple elnk 8 1,738 Oct-26-2022, 04:03 PM
Last Post: deanhystad
  -i option changes sys.path (removes leading empty string '') markanth 6 1,901 Aug-26-2022, 09:27 PM
Last Post: markanth
  Membership test for an element in a list that is a dict value for a particular key? Mark17 2 1,162 Jul-01-2022, 10:52 PM
Last Post: Pedroski55
  How to find the second lowest element in the list? Anonymous 3 1,907 May-31-2022, 01:58 PM
Last Post: Larz60+
  check if element is in a list in a dictionary value ambrozote 4 1,884 May-11-2022, 06:05 PM
Last Post: deanhystad
  The code I have written removes the desired number of rows, but wrong rows Jdesi1983 0 1,603 Dec-08-2021, 04:42 AM
Last Post: Jdesi1983
  sorting a list of lists by an element leapcfm 3 1,807 Sep-10-2021, 03:33 PM
Last Post: leapcfm
  Convert each element of a list to a string for processing tester_V 6 5,172 Jun-16-2021, 02:11 AM
Last Post: tester_V

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020