【问题标题】:Python Strange Behavior with List & Append列表和追加的 Python 奇怪行为
【发布时间】:2012-06-28 07:53:21
【问题描述】:

以下代码是我遇到的问题,正在寻找解释。代码的行为与我的预期不同。代码下方将是我的预期输出和实际输出。最后要注意的一件事是,我知道这段代码可能很“奇怪”,而且使用 range(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 上运行。

【问题讨论】:

  • listA 是类而不是实例变量
  • 尽管在 User() 类的缩进中?
  • 是的,它是一个类变量,尽管缩进到类变量的级别
  • 这就是为什么它是一个 class 而不是全局变量,是的。从 Python 教程开始了解 Python 中与 Java 不同的那些小“怪癖”可能是一个好主意。仍然:要获取实例变量,请将其分配给 self,即:self.listA = []。编辑:谁又在投票?这是 许多 新 python 人都会发生的错误,通常很难用谷歌搜索..
  • 这是有道理的。感谢您的帮助,并为对 Python 类的无知感到抱歉! @Gnibbler & Voo

标签: python list append


【解决方案1】:

将此与您的代码进行比较

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

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

【讨论】:

  • 没错,但我试图弄清楚如何做到这一点。我感谢您的帮助!另一个 StackOverflow 问题也有助于讨论类的 init 方法来声明类级变量。
猜你喜欢
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-28
  • 2020-08-02
  • 2015-10-27
  • 1970-01-01
相关资源
最近更新 更多