在python中作为引用类型列出
下面是我用来计算第n个素数的代码。 我初始化arr=[2,3,5];素数(arr,n)应该修改arr以包含前n个素数。但arr并不反映在prime(arr,n)执行后的更改。 我听说列表是作为引用类型传递的,那么下面代码中的问题是什么呢。 t表示必须进行验证的测试用例数量 程序导致一个错误,表示数组索引超出了arr的界限在python中作为引用类型列出,python,primes,Python,Primes,下面是我用来计算第n个素数的代码。 我初始化arr=[2,3,5];素数(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;
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 ';
导入系统;
def基本(arr,n):
而(len(arr)>
1.
4.
你好
[2, 3, 5, 7]
--
[2, 3, 5]
arr已打印
回溯(最近一次呼叫最后一次):
文件“C:\Users\Pulkit\Desktop\Random\nth\u prime.py”,第30行,在
ans=ans+[arr[n-1]];
索引器:列表索引超出范围
提前感谢:)更改线路:
arr = arr + [num];
到
新行实际上更改了arr
数组。原来的行没有改变它;它创建了一个名为arr
的新变量(它是一个)
此更改后的示例运行:
1
4
hello
[2, 3, 5, 7]
--
[2, 3, 5, 7]
arr was printed
[7]
ans
列表确实是引用类型(无论它们是否作为参数传递)。但是,这有一个特定的定义明确的含义,与通过引用传递的含义不同。引用类型只是意味着它总是通过抽象句柄引用,而不是被复制(比如,在变量赋值时)。因此,可变引用类型可以从多个地方进行变异,比如从另一个函数
在您的特定情况下,使用
arr.append(…)
而不是arr=arr+[…]
(这在时间和空间上都非常有效)。第一个对list对象进行了变异,后者创建了一个新的list对象,并将对它的引用存储在一个局部变量中(而不是更新传入的变量以引用新对象,就像通过引用传递一样)。我想您的缩进功能已关闭。SO上正确缩进的提示:每个缩进级别使用4个空格,不要使用TAB(\t
)。实际上我从python脚本复制了代码,所以\t也被复制了。在python中,这个arr[len(arr)-1]应该像arr[-1]解释那样编写:arr.append
实际上更改了由arr
指向的对象,而arr=arr+[num]
创建一个新列表并重新分配名称arr
以指向该新列表,保留通过的旧版本不变。也感谢您的解释:)
arr.append(num)
1
4
hello
[2, 3, 5, 7]
--
[2, 3, 5, 7]
arr was printed
[7]
ans