列表和放大器的Python奇怪行为附加

时间:2012-06-26 22:24:18

标签: python list append

以下代码是我遇到的问题,正在寻找解释。代码的行为与我的预期不同。下面的代码将是我的预期输出和实际输出。最后要注意的是,我理解这段代码可能是“奇怪的”,并且使用范围(1)至少可以说有点奇怪。这样做的原因是程序中这种确切的出现(范围是变量但是在这些值上)引起了问题..所以我制作了这个简单的代码来复制它。

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)

预期输出

['a']
['b']
['a']
['b']
['a']
['b']
['a']
['b']
['a']
['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']
['a','a','a','a','a']
['b','b','b','b','b']

讨论

我很感激为什么会发生这种情况。我不确定内置的append()函数是否以某种方式影响所有用户,或者每个用户是否以某种方式共享其字段。在Python 2.7.3上运行。

1 个答案:

答案 0 :(得分:8)

将此与您的代码进行比较

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')

请注意,没有必要在班级“声明”任何变量