当前位置: 首页 > 知识库问答 >
问题:

Python-附加到for循环内声明的对象列表

王云
2023-03-14

我有一个非常具体的问题,我在网上任何地方都找不到答案。我不熟悉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中,如何更改这一点?

共有2个答案

龙飞文
2023-03-14

您的类Example正在使用类变量Example。用于存储字符串的项。类变量在对象的所有实例中都是共享的,这就是为什么您将它们都放在一起并认为它是同一个对象,而实际上它不是。

您应该创建变量,并在\uuuuu init\uuuu函数中将其分配给self

class Example(object):

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

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

另外,当您使用Python2时。x、 你真的应该像我在那里做的那样把对象子类化。

太叔京
2023-03-14

将类定义更改为:

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

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

 类似资料:
  • 问题内容: ja块变量还是局部变量?我看到j的作用域只是直到for循环结束 问题答案: 局部变量在方法,构造函数或块中声明。 由此可见, 所有块变量都是局部变量。 按照块的定义 块是平衡括号之间的一组零个或多个语句,可以在允许单个语句的任何地方使用。 所以 无论在块内声明什么变量,范围都限于该块。 因此范围仅限于该块内部。那是循环。

  • 问题内容: 以下代码段是否会降低性能? 还是这段代码实际上更有意义? 如果在字节码中这两个完全相等,那么显然第一种方法在样式方面看起来更好,但我想确保确实如此。 问题答案: 在当今的编译器中,没有。我在最小范围内声明对象,因为对于下一个家伙而言,它更具可读性。

  • 问题内容: 我有一个循环,将一个列表的值设置为另一个列表的值,虽然我可以用当前代码实现此目的,但它只是将最后一组值附加到列表中。在我的设置中可能会导致该问题的原因是什么? 这是我的数据格式: 这是我的格式: 这是我的for循环功能: 这是控制台: 它错过了前两个循环的值,但是完美地捕获了数组中的第三个循环。 问题答案: 应该在语句之后循环外,否则您将覆盖每次迭代中添加到列表的值。

  • 问题内容: 在循环内部声明变量是否不好?在我看来,这样做,如下面的第一个代码块所示,将使用第二次的十倍的内存…由于在循环的每次迭代中都创建了一个新的字符串。这样对吗? 与 问题答案: 在循环内部声明变量是否不好? 一点也不!它将变量本地化到其使用点。 在我看来,如下面的第一个代码块所示,这样做将使用十倍于第二个内存的内存。 编译器可以优化内容以保持内存使用效率。仅供参考:如果您使用关键字告诉您变量

  • 问题内容: 为什么以下工作正常? 但是据说这是危险的/不正确的: 是否需要在循环外声明变量? 问题答案: 局部变量的范围应始终尽可能小。 在你的例子我相信是不会使用的外while循环,否则你就不会问这个问题,因为它声明的内部while循环不会是一个选项,因为它不会编译。 所以,既然是不使用外循环,在尽可能小的范围是内 while循环。 所以,答案是着重那绝对应该被while循环内声明。没有,没有,

  • 我试图在for循环中获得for循环,因此输出如下: 我希望输出显示一个正方形 我不知道它为什么不这样做。下面是我的代码: