2016-08-04 4 views
2

私は、次のような方法があります:スライスリスト(Pythonの3)

def slice_list(my_list, slice_point): 
    my_list = my_list[:slice_point] 
    print("Inside method: ", my_list) 

    return 

私は次のようにそれのためのテストを持っている:

if __name__ == "__main__": 
    my_list = [1,2,3,4,5] 
    slice_point = 3 

    slice_list(my_list, slice_point) 
    print("Outside method: ", my_list) 

私が手出力ではありません私は、リストが最終的に

>>>Inside method: [1, 2, 3] 
>>>Outside method: [1, 2, 3, 4, 5] 

を編集していないという意味で、ために期待される。しかし、私はリストにappendを行う際に、I tがこの例が示すように、良いのためのリストを編集します:

次のように出力できます
def append_to_list(my_list, element): 
    my_list.append(element) 
    print("Inside method: ", my_list) 

    return 

if __name__ == "__main__": 
    my_list = [1,2,3,4,5] 
    append_to_list(my_list, "new element") 
    print("Outside method: ", my_list) 

>>>Inside method: [1, 2, 3, 4, 5, 'new element'] 
>>>Outside method: [1, 2, 3, 4, 5, 'new element'] 

なぜスライスが良いためのリストを変更しませんか?

+3

ローカル変数とグローバル変数について読んでください。グローバルとして指定されていない限り、関数内で作成または再割り当てされた変数はすべてローカルとみなされます。しかし、追加は再割り当てされません。 – Julien

+0

また、関数ではありませんメソッドです。 –

答えて

3

は、代わりにこれを試してみてください:

my_list[:] = my_list[:slice_point] 

あなたの古い方法はただすなわち、スライスによって返されたコピーで、新しいオブジェクトの名前my_listを指します。

私が上で提案した提案は、my_listがその名前を再バインドせずに最初に指し示したオブジェクトを変更します。