2

以下是我编写的用于计算第 n 个素数的代码。我初始化 arr = [2,3,5]; 并且 prime(arr,n) 应该修改 arr 以包含前 n 个素数。但 arr 不反映 prime(arr,n) 执行后的变化。我读到列表是作为引用类型传递的,所以下面的代码有什么问题。t 表示必须进行验证的测试用例的数量。

该程序导致错误,指出数组索引超出了 arr 的范围。

import sys;
def prime (arr,n):
    while(len(arr)< n):
        num=arr[len(arr)-1]+1;prime=0;
        while(prime==0):
            prime = 1
            for val in arr:
                if(num%val==0):
                    prime=0;
                    break;
            if(prime == 1):
                print "hello";
                arr = arr + [num];print arr; print "--";
            else:
                num = num+1;


t=raw_input();
t=int(t);
arr=[2,3,5];
ans =[];
for v in range (0,t):
    n = raw_input();
    n = int(n);
    if(n<=len(arr)):
        ans = ans + [arr[n-1]];
    else:
        prime(arr,n);print arr;print"arr was printed"
        ans= ans + [arr[n-1]];
print ans;print 'ans ';

以下是上述代码的示例运行

>>> 
1
4
hello
[2, 3, 5, 7]
--
[2, 3, 5]
arr was printed

Traceback (most recent call last):
  File "C:\Users\Pulkit\Desktop\Random\nth_prime.py", line 30, in <module>
    ans= ans + [arr[n-1]];
IndexError: list index out of range

提前致谢 :)

4

2 回答 2

7

换行:

arr = arr + [num];

arr.append(num)

新行实际上更改了arr数组。原行没有改变它;它创建了一个名为的变量arr(它是重新绑定操作而不是变异操作

此更改后的示例运行:

1
4
hello
[2, 3, 5, 7]
--
[2, 3, 5, 7]
arr was printed
[7]
ans 
于 2012-08-15T20:54:39.333 回答
1

列表确实是引用类型(无论它们是否作为参数传递)。但是,这具有特定的定义明确的含义,与传递引用不同。作为引用类型的东西只是意味着它总是通过抽象句柄引用,而不是被复制(例如,在变量赋值时)。由此可见,可变引用类型可以从多个地方变异——例如从另一个函数。

在您的特定情况下,使用arr.append(...)代替arr = arr + [...](这在时间和空间上也非常有效)。第一个改变列表对象,后者创建一个新的列表对象并将对它的引用存储在局部变量中(而不是更新传入的变量以引用新对象,就像使用 pass-引用)。

于 2012-08-15T20:58:08.477 回答