以下是我编写的用于计算第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
提前致谢:)
答案 0 :(得分:7)
更改行:
arr = arr + [num];
到
arr.append(num)
新行实际上更改了arr
数组。原线并没有改变它;它创建了一个名为arr
的新变量(它是rebinding operation instead of a mutating one)
此更改后的示例运行:
1
4
hello
[2, 3, 5, 7]
--
[2, 3, 5, 7]
arr was printed
[7]
ans
答案 1 :(得分:1)
确实列表是引用类型(它们是否作为参数传递)。但是,这具有明确定义的特定含义,与传递引用不同。作为引用类型的东西仅仅意味着它总是通过抽象句柄引用,而不是被复制(例如,在变量赋值时)。因此,可变参考类型可以从多个地方变异 - 例如来自另一个函数。
在您的具体情况下,请使用arr.append(...)
代替arr = arr + [...]
(在时间和空间上效率也非常高)。第一个突变列表对象,后者创建一个新的列表对象并在局部变量中存储对它的引用(而不是更新传入的变量以引用新对象,因为它将是传递的 - 通过引用)。