2016-08-26 4 views
0

これは私が(How can python function actually change the parameter rather than the formal parameter?訪問)に尋ねたこれと同様の質問です。私はリストを正式なパラメータに使用しています。リストは参照型なので、以前と同じように動作するはずです。 は、だからここに私のコードです:ここでは私は関数のパラメータとしてリストを使用し、関数は実際のパラメータの値を変更することはできませんが、仮パラメータのみを変更するのはなぜですか?

def twomerger(lx, ly): 
    if lx[0] == ly[0]: 
     lx[0] = ly[0] 
     ly[0] = 0 
    if lx[1] == ly[1]: 
     lx[1] = ly[1] 
     ly[1] = 0 
    if lx[2] == ly[2]: 
     lx[2] = ly[2] 
     ly[2] = 0 
    if lx[3] == ly[3]: 
     lx[3] = ly[3] 
     ly[3] = 0 


row1 = [0, 2, 4, 4] 
row2 = [2, 2, 4, 4] 
twomerger(row1, row2) 
print (row1) 
print (row2) 
print ("it's a new situation:") 
print (row1) 
print (row2) 

は私が転送しよう[0、2、4、4]及び[2、2、4、4]に[0、4、8、8]および[ 2,0,0,0]である。 (同じ垂直方向の数字が加算されます)。私は2つのリストを渡した - row1とrow2私の関数twomergerのパラメータに。私はrow1とrow2がリストなので、これらの参照は、この関数がrow1とrow2を変更することができるはずだと思った。しかし、それは私に結果を与える[0, 2, 4, 4][2, 2, 4, 4]これは、機能が動作しないことを意味します。だから私は再び混乱している。

+0

関数に変数を直接変更させるのは、とにかく悪い習慣です。あなたはlxとlyを返す方が良いです。 – u8y7541

+1

@ u8y7541のように、いったんそれが行われているリストを変更する関数には何も問題はありません。私はちょうどいくつかの要素を変更/変更するために2つの新しいリストを作成したくないでしょう。 –

+0

同じ事を2回印刷するバグ/タイプミスですか?それらの間に "その新しい状況"という言葉がありますか?テストがうまくいくかどうかは変わりませんが、それは常に同じことを2回印刷することです - あなたは 'twomerger()'コールの前に最初のものを望みます。 – GreenAsJade

答えて

3

あなたの問題は、リスト内の値に追加する必要がありますが、代わりに再割り当てすることです。

def twomerger(lx, ly): 
    if lx[0] == ly[0]: 
     lx[0] += ly[0] 
     ly[0] = 0 
    if lx[1] == ly[1]: 
     lx[1] += ly[1] 
     ly[1] = 0 
    if lx[2] == ly[2]: 
     lx[2] += ly[2] 
     ly[2] = 0 
    if lx[3] == ly[3]: 
     lx[3] += ly[3] 
     ly[3] = 0 

row1 = [0, 2, 4, 4] 
row2 = [2, 2, 4, 4] 
twomerger(row1, row2) 
print (row1) 
print (row2) 

出力=+=に変更し、それは価値がある何のため

[0, 4, 8, 8] 
[2, 0, 0, 0] 

を、あなたの方法は、はるかに簡潔に書くことができます。

def twomerger(lx, ly): 
    for i, num in enumerate(lx): 
     if lx[i] == ly[i]: 
      lx[i] += ly[i] 
      ly[i] = 0 

それとも、快適にしている場合zip

def twomerger(lx, ly): 
    for i, (a, b) in enumerate(zip(lx, ly)): 
     if a == b: 
      lx[i] += b 
      ly[i] = 0 
+0

enumerate(zip(lx、ly))でzip 'for i、(a、b)を使用して複数のインデックスを作成することを避けることができます:a == b ...' –

+1

確かに - メモを追加しました。私は初心者の方がこの種の質問に関して誤っている傾向がありますが、未来のユーザーのためにさらに多くのオプションを挙げるのは良いことです:) – Karin

+0

本当は、要素の賢明な比較のためにzipを使用するのは慣用的なアプローチでしょう。 –

関連する問題