2

以下は、n番目の素数を計算するために書いたコードです。arr = [2,3,5]; を初期化します。また、prime(arr,n) は、最初の n 個の素数を含むように arr を変更することになっています。しかし、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 + [...](時間と空間の両方で非常に効率的です)。前者はリストオブジェクトを変更し、後者は新しいリストオブジェクトを作成し、それへの参照をローカル変数に保存します(パスの場合のように、渡された変数を新しいオブジェクトを参照するように更新する代わりに)参照による)。

于 2012-08-15T20:58:08.477 に答える