Python Strange Behavior with List & Append

append, list, python

Solution

Compare this to your code

class User():
    def setup(self):
        self.listA = []                          # instance variable
        self.listB = []                          # instance variable
        for i in range(1):
            self.listA.append('a')
            self.listB.append('b')

Note that it's not necessary to "declare" any variables at the class level

Problem

The following code is an issue I encountered and am looking for an explanation. The behavior of the code different than what I expected. Below the code will be my expected output, and the actual output. One last thing to note, is that I understand this code may be 'strange', and that using range(1) is a bit odd to say the least. The reason for this is that this exact occurrence in a program (the ranges were variables but at these values) caused problems.. so I made this simple code to replicate it. ``` userList = [] class User(): listA = [] listB = [] def setup(self): for i in range(1): self.listA.append('a') self.listB.append('b') for i in range(5): user = User() userList.append(user) for i in range(len(userList)): userList[i].setup() for i in range(len(userList)): print str(userList[i].listA) print str(userList[i].listB) ``` Expected Output ``` ['a'] ['b'] ['a'] ['b'] ['a'] ['b'] ['a'] ['b'] ['a'] ['b'] ``` Actual Output ``` ['a','a','a','a','a'] ['b','b','b','b','b'] ['a','a','a','a','a'] ['b','b','b','b','b'] ['a','a','a','a','a'] ['b','b','b','b','b'] ['a','a','a','a','a'] ['b','b','b','b','b'] ['a','a','a','a','a'] ['b','b','b','b','b'] ``` Discussion I appreciate any explanation as to why this is happening. I'm not sure if the built-in append() function is somehow affecting all Users, or if each User is somehow sharing their fields. Running on Python 2.7.3.

Original source