【问题标题】:Python - Appending to a list of an object declared inside a for loopPython - 附加到在 for 循环中声明的对象列表
【发布时间】:2014-11-25 13:09:06
【问题描述】:

我遇到了一个非常具体的问题,我无法在网络上的任何地方找到答案。我是 python 代码的新手(C++ 是我的第一语言),所以我假设这只是一个语义问题。我的问题是关于在 for 循环范围内声明的对象。

这段代码的目的是在 for 循环中创建一个新的临时对象,将一些项目添加到它的列表中,然后将对象放入 for 循环之外的列表中。在 for 循环的每次迭代中,我希望创建一个新的、单独的对象来填充项目。但是,每次执行 for 循环时,对象的列表都已经填充了上一次迭代中的项目。

我有一个更大的程序也有同样的问题,但我没有包含一个庞大的程序,而是写了一个有相同语义问题的小例子:

#Test

class Example:
    items = []

objList = []

for x in xrange(5):
    Object = Example()

    Object.items.append("Foo")
    Object.items.append("Bar")
    print Object.items

    objList.append(Object)

print "Final lists: "
for x in objList:
    print x.items

到程序结束时,objList 中的每个项目(甚至是第一次迭代中的项目)都包含

["Foo","Bar","Foo","Bar","Foo","Bar","Foo","Bar","Foo","Bar"]`

这让我相信示例(在本例中称为 Object)不会在每次迭代中重新创建,而是在每次迭代中保持不变,并在每次 for 循环继续时访问。

我的简单问题;在python中,我该如何改变这个?

【问题讨论】:

    标签: python class object for-loop static


    【解决方案1】:

    将您的类定义更改为:

    class Example:
        def __init__(self):
            self.items = []
    

    问题是items 没有绑定到每个对象的实例,它是类定义的一部分。因为items是一个类变量,所以在Example的实例之间共享。

    【讨论】:

    • 这解决了我的问题,谢谢!我不知道存在类范围的变量。
    【解决方案2】:

    您的班级Example 正在使用class variable Example.items 来存储字符串。类变量在对象的所有实例之间共享,这就是为什么您将它们放在一起并认为它是同一个对象,而实际上它不是。

    您应该创建items 变量并将其分配给您的__init__ 函数中的self

    class Example(object):
    
        def __init__(self):
            self.items = []
    

    这将确保Example 的每个实例都有自己的items 列表可供使用。

    另外,由于您使用的是 Python 2.x,因此您确实应该像我那样子类化 object

    【讨论】:

    • 和其他人一样,这解决了我的问题。现在我知道了对象共享变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 2023-01-07
    相关资源
    最近更新 更多