2017-07-18 2 views
0

append()、insert()などの手作業でリストメソッドをいくつか実装しています。リストの最後に(appendメソッドのように) 。これは私が使用している作業コードです:Pythonの関数リスト(戻り値付き)を更新するには

arr = [4,5,6] 

def push(x, item): 
    x += [item] 
    return x 

push(arr,7) 
print(arr)  #Output: [4,5,6,7] 

しかし、私はほとんど違いが同じコードを実装しています。私は別の出力を得ています。

arr = [4,5,6] 

def push(x, item): 
    x = x + [item] 
    return x 

push(arr,7) 
print(arr)  #Output: [4,5,6] 

また、挿入方法も同じです。ここでinsertメソッドのコードは次のとおりです。

arr = [4,5,7,8] 

def insert(x, index, item): 
    x = x[:index] + [item] + x[index:] 
    return x 

insert(arr,2,6) 
print(arr)  #Output: [4,5,7,8] 

そのリストが自動的に私の最初のコードサンプルのように関数を呼び出した後、更新を取得し、私はarr=insert(arr,2,6)でリストに戻り値を格納することができます知っているが、私は別の解決策を求めています。

編集1: 私はx[index:index] = [item]がこの問題の解決策であると考えています。

+0

[関連](https://stackoverflow.com/questions/15376509/when-is-ix-different-from-iix-in-python) – jacoblaw

答えて

1

あなたはlist.insertを使用してO/Wあなたinsertを実装するために、リストのスライスに割り当てることができます。

def insert(x, index, item): 
    x[:] = x[:index] + [item] + x[index:] 

これは新しいリストとxが参照するオブジェクトの内容を置き換えます。その場で実行されるので、それを返す必要はありません。

+1

x [index:index] = [item ] '?それは少なくともいくつかの一時的なコピーを避ける:) – MSeifert

1

x += [item]およびx = x + [item]は少し違いがあります。最初のケースでは、xが参照するリストを変更するように求めています。これが結果が変化を反映している理由です。第二に、あなたはxに新しいリストを参照するように求めています。xの元の値と[item]を組み合わせて作られたものです。これはではなく変更xであることに注意してください。結果は変わりません。

返される値は無視されるため、返されるステートメントは無関係です。

-2

問題は、返された結果をキャプチャしていないことです。一部の操作(+=など)は、元のリストを変更します。他のユーザー(x = x + itemなど)は新しいリストを評価し、ローカル変数xを再割り当てします。

特に、xは、であり、からarrではありません。 xは単なるローカル変数です。 arrに返された値を取得するには、あなたがそれを割り当てる必要があり:あなたの最初の例で

arr = push(arr, 7) 

または

arr = insert(arr, 2, 6) 
0

をあなた(別名変更)xによって参照リストオブジェクトを変異させ。Pythonはx += [item]を見たとき、それはそれを翻訳:あなたが見ることができるように

x.__iadd__([item]) 

、我々はそれを呼び出すことにより、xによって参照リストオブジェクトを変異されているが、インプレース演算機能__iadd__をオーバーロードしています。すでに述べたように、__iadd__()は、既存のリストオブジェクト変異する:あなたの第二の例では

>>> lst = [1, 2] 
>>> lst.__iadd__([3]) 
[1, 2, 3] 
>>> lst 
[1, 2, 3] 
>>> 

を、あなたは新しい参照にxを割り当てるためのPythonを尋ねました。現在参照されているのは、x[item]のリストを組み合わせて(変更せずに)作成した新しいリストオブジェクトです。したがって、xは変更されませんでした。

Pythonはx = x + [item]を見たとき、それはに変換することができます。

x = x.__add__([item]) 

既存のリストオブジェクトを変化させませんリストの__add__機能。むしろ、それは、既存のリストの値と__add__()に渡される引数をコーミングによって行われた新しいリストを返します。

>>> lst = [1, 2] 
>>> lst.__add__([3]) # lst is not changed. A new list is returned. 
[1, 2, 3] 
>>> 

あなたはarrリストへpushのバージョンの結果を返す必要があります。 insertも同様です。