我有一个非常具体的问题,我在网上任何地方都找不到答案。我不熟悉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中,如何更改这一点?
您的类Example
正在使用类变量Example。用于存储字符串的项。类变量在对象的所有实例中都是共享的,这就是为什么您将它们都放在一起并认为它是同一个对象,而实际上它不是。
您应该创建
项
变量,并在\uuuuu init\uuuu
函数中将其分配给self
class Example(object):
def __init__(self):
self.items = []
这将确保
示例
的每个实例都有自己的项
列表可供使用。
另外,当您使用Python2时。x、 你真的应该像我在那里做的那样把
对象子类化。
将类定义更改为:
class Example:
def __init__(self):
self.items = []
问题是项
没有绑定到每个对象的实例,它是类定义的一部分。因为items
是一个类变量,所以它在示例的实例之间共享。
问题内容: ja块变量还是局部变量?我看到j的作用域只是直到for循环结束 问题答案: 局部变量在方法,构造函数或块中声明。 由此可见, 所有块变量都是局部变量。 按照块的定义 块是平衡括号之间的一组零个或多个语句,可以在允许单个语句的任何地方使用。 所以 无论在块内声明什么变量,范围都限于该块。 因此范围仅限于该块内部。那是循环。
问题内容: 以下代码段是否会降低性能? 还是这段代码实际上更有意义? 如果在字节码中这两个完全相等,那么显然第一种方法在样式方面看起来更好,但我想确保确实如此。 问题答案: 在当今的编译器中,没有。我在最小范围内声明对象,因为对于下一个家伙而言,它更具可读性。
问题内容: 我有一个循环,将一个列表的值设置为另一个列表的值,虽然我可以用当前代码实现此目的,但它只是将最后一组值附加到列表中。在我的设置中可能会导致该问题的原因是什么? 这是我的数据格式: 这是我的格式: 这是我的for循环功能: 这是控制台: 它错过了前两个循环的值,但是完美地捕获了数组中的第三个循环。 问题答案: 应该在语句之后循环外,否则您将覆盖每次迭代中添加到列表的值。
问题内容: 在循环内部声明变量是否不好?在我看来,这样做,如下面的第一个代码块所示,将使用第二次的十倍的内存…由于在循环的每次迭代中都创建了一个新的字符串。这样对吗? 与 问题答案: 在循环内部声明变量是否不好? 一点也不!它将变量本地化到其使用点。 在我看来,如下面的第一个代码块所示,这样做将使用十倍于第二个内存的内存。 编译器可以优化内容以保持内存使用效率。仅供参考:如果您使用关键字告诉您变量
问题内容: 为什么以下工作正常? 但是据说这是危险的/不正确的: 是否需要在循环外声明变量? 问题答案: 局部变量的范围应始终尽可能小。 在你的例子我相信是不会使用的外while循环,否则你就不会问这个问题,因为它声明的内部while循环不会是一个选项,因为它不会编译。 所以,既然是不使用外循环,在尽可能小的范围是内 while循环。 所以,答案是着重那绝对应该被while循环内声明。没有,没有,
我试图在for循环中获得for循环,因此输出如下: 我希望输出显示一个正方形 我不知道它为什么不这样做。下面是我的代码: