2012-05-10 21 views
1

私はPython関数func(A)を持っています。 Anumpy.arrayであり、何度も繰り返しコピーすることを躊躇するほど大きくなる可能性があります。このfunc(A)はAの内容を変更したいと思っています。これはPython初心者の問題です。私はCでプログラミングしていましたが、それはポインタで行うことができました。 Aの内容を変更して、func(A)の範囲外でも変更が有効になるようにするにはどうすればよいですか?python:関数パラメータ更新の問題

+0

この[この] [1]と同様のポストへの応答は、あなたの質問に答えていませんか? [1]:http://stackoverflow.com/questions/10149416/numpy-modify-array-in-place –

+0

私はパラメータはグローバル変数ではないかもしれないことを述べることがあると思います。それはクラスのメンバーかもしれません。私はそれを試しますが、本当の問題は本当に変数を関数に渡すときに何が起こっているのか分かりません。コンテンツをコピーすることは決してありませんか、またはPythonで「参照渡し」や「値渡し」などはありません。 C言語では、ポインタは最初は分かりにくいですが、私は理解していましたが、今、これは... –

+0

これはグローバルとは関係ありません。あなたは、すべての引数をPythonで参照渡しとして考えることができます。 –

答えて

6

tl; drはあなたの場合には、基本的には既にあります。メソッドのラベルAに新しい値を代入しない限り、Aは渡されたオブジェクトへの参照になります。つまり、Aを変更すると、元のオブジェクトが変更されます。

例:

>>> def foo(A): 
...  print A[0] 
...  A[0] = 2 
...  print A[0] 
... 
>>> a = [0, 1, 2] 
>>> foo(a) 
0 
2 
>>> a 
[2, 1, 2] 
>>> def bar(A): 
...  print A[0] 
...  A = [0, 1, 2] 
...  A[0] = 2 
...  print A[0] 
... 
>>> a = [0, 1, 2] 
>>> bar(a) 
0 
2 
>>> a 
[0, 1, 2] 
+1

+1。言い換えれば、 'numpy'配列は変更可能です。しかし、いくつかの 'numpy'関数はコピーを返します。配列をコピーするのではなく、突然変異することが保証されているいくつかの基本的な事柄を綴る価値があるかもしれません。 (item assignment、in-place数学演算など) – senderle

+0

+1 C++開発者としては自分自身で、変数とは対照的にラベルを使ってPythonについて心がけています。どこかにインターネット上の写真を載せた素敵なページがありました...今どこに行きましたか? – JoeFish

+0

私はそれを得ていませんでした。代入なしで配列を更新するにはどうすればよいですか?実際の演算は 'A = A + k * C'です.kはスカラー、Cはローカルなnumpy.arrayです。 –

0

Aに渡すパラメータがグローバルパラメータである場合は、パラメータAの値を変更できます。もう1つの方法は、変数を関数から関数に渡すことです。 から私がPythonで理解しているものは、そうしたときにオブジェクトはコピーされません。

+0

実際、Aはグローバル変数ではなく、クラスのメンバーであり、funcは別のクラスのメンバーです。 –