2011-01-30 10 views
2
>>> def test(): 
... a.remove(1) 
>>> a = [1,2] 
>>> test() 
>>> print a 
[2] 

なぜa[1,2]ではなく[2]と等しいのですか?基本的なpython。関数のリストの変更を禁止する方法は?

+1

次回はコードの書式設定を使用し、質問を投稿する前にプレビューをご覧ください。 – AndiDog

+1

これはグローバル変数を使用しています。このようなコード例はどこで見たことがありますか? –

答えて

6

リストは変更可能です。関数に渡して関数を変更すると、変更されたままになります。

  • は不変の構造を使用してください:タプル:a = (1,2)
  • は、元のリストのコピーを渡し:b = list(a); b.remove(1) - 今abは異なる内容を持っている、aが変更されていません。

また、可変グローバルデータを使用しないでください。関数にaを渡すか、オブジェクトの属性としてaを持ち、そのメソッドとして関数を持ちます。

+1

タプルを不変のリストと考えるべきではありません。 Pythonは、関数が何をするかを制御することではありません。関数doc stringは、パラメータ/グローバルなどを変更するかどうかを教えてくれるはずです。コピーを渡すように+1しますが、そのために不変構造に切り替えるには-1を返します。 –

+0

@gnibbler:不変構造を使用すると、偶発的な変更を防ぐことができます。 Pythonにはほとんどすべての静的チェックがありません。時には少々防衛的になりたいかもしれません。また、不変構造を簡単に共有して再利用することもできます。可変構造を共有することは、常により難しいです。 – 9000

2

あなたが望むものは明確ではありません。 test()関数はグローバル 'a'リストを変更するので、 'a'が変更されることは驚くことではありません。

'test'をaの代わりに直接動作させたい場合は、最初にコピーすることができます。例えば

def test(): 
    a2 = list(a) 
    a2.remove(1) 
0

リストは、それらが変更されることを意図されている、可変オブジェクトです。変更を禁止する場合は、代わりにタプル(例:a = (1, 2))に変換してください。タプルは不変なので、変数をコピーして再割り当てせずにタプルを変更することはできません。

0

リストaがグローバル名前空間に存在するため、removeを呼び出すと、値1が削除されます。

変更したくない場合は、新しいリストを作成するだけです。リストaremoveを呼び出すと、もちろん値を削除します。