Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中作为引用类型列出_Python_Primes - Fatal编程技术网

在python中作为引用类型列出

在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;

下面是我用来计算第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;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