为什么列表在python和Java中表现不同?

eag*_*arn 1 python java arrays for-loop list

我正在学习脚本语言python.我非常了解Java.我试图将一些代码从Java翻译成python.但是它们表现不正常(或者我的理解可能完全错误)我在Java中有以下代码,我将无限期地向ArrayList添加元素.所以这会导致outofmemory错误,我期望:

import java.util.*;
public class Testing{
public static void main(String[] args){
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(5);
        list.add(4);
        for (int i=0;i<list.size();i++){
            list.add(5);
        }
}
}
Run Code Online (Sandbox Code Playgroud)

现在在python中翻译相同的代码:

lst = []
lst.append(5)
lst.append(4)
for i in range(len(lst)):
    lst.append(5)
print lst
Run Code Online (Sandbox Code Playgroud)

在这里我得到输出: [5, 4, 5, 5]

从我看到的,是不是作为forpython循环的引用传递的列表?

同样在这里,

>>> l=[1,2,3]
>>> for i in l[:]:
...    l.append(4)
...    print l
... 
[1, 2, 3, 4]
[1, 2, 3, 4, 4]
[1, 2, 3, 4, 4, 4]
Run Code Online (Sandbox Code Playgroud)

在循环内的每次迭代中for,我都在增加列表大小,所以迭代应该永远正确吗?

Mar*_*ers 10

python for循环计算表达式,该表达式产生迭代,只能循环一次.您可以lst在循环中操作对象,而不会影响循环的结果for.这与Java for构造(这是一个与Python for语句非常不同的构造,它实际上是一个Foreach构造)不同,后者评估每次迭代的3个关联表达式.

在第一个示例中,您创建了一个range()结果,一旦创建了结果,就不会为每个循环迭代更新结果.

在第二个示例中,您创建了一个lst使用全长slice(lst[:])的副本,以便循环迭代.不会为每个循环迭代重新创建副本.

但是,这里有一个警告.该for循环调用iter()的对象要被重复-过来.对于列表对象,结果列表迭代器确实保留对原始列表的引用,以及迭代索引.每次for循环前进迭代器(调用next()它)时,迭代索引都会递增并在原始列表中查找,直到索引等于列表长度.如果你继续添加循环中的列表,那创建一个无限循环.

如果您创建要迭代的列表副本,则可以看到此内容:

>>> L = [1, 2, 3]
>>> for i in L:
...     L.append(4)
...     print L
...     if len(L) > 30:
...         break
... 
[1, 2, 3, 4]
[1, 2, 3, 4, 4]
[1, 2, 3, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
Run Code Online (Sandbox Code Playgroud)

这里,为循环中扩展而创建的迭代器L继续产生下一个元素L,如果我没有在循环中添加长度限制,这将永远持续下去.


rad*_*dai 6

range(len(lst))创建一次范围,然后迭代,而list.size()在每次迭代时评估java