>>> def test():
... a.remove(1)
>>> a = [1,2]
>>> test()
>>> print a
[2]
なぜa
は[1,2]
ではなく[2]
と等しいのですか?基本的なpython。関数のリストの変更を禁止する方法は?
>>> def test():
... a.remove(1)
>>> a = [1,2]
>>> test()
>>> print a
[2]
なぜa
は[1,2]
ではなく[2]
と等しいのですか?基本的なpython。関数のリストの変更を禁止する方法は?
リストは変更可能です。関数に渡して関数を変更すると、変更されたままになります。
a = (1,2)
b = list(a); b.remove(1)
- 今a
とb
は異なる内容を持っている、a
が変更されていません。また、可変グローバルデータを使用しないでください。関数にa
を渡すか、オブジェクトの属性としてa
を持ち、そのメソッドとして関数を持ちます。
タプルを不変のリストと考えるべきではありません。 Pythonは、関数が何をするかを制御することではありません。関数doc stringは、パラメータ/グローバルなどを変更するかどうかを教えてくれるはずです。コピーを渡すように+1しますが、そのために不変構造に切り替えるには-1を返します。 –
@gnibbler:不変構造を使用すると、偶発的な変更を防ぐことができます。 Pythonにはほとんどすべての静的チェックがありません。時には少々防衛的になりたいかもしれません。また、不変構造を簡単に共有して再利用することもできます。可変構造を共有することは、常により難しいです。 – 9000
あなたが望むものは明確ではありません。 test()関数はグローバル 'a'リストを変更するので、 'a'が変更されることは驚くことではありません。
'test'をaの代わりに直接動作させたい場合は、最初にコピーすることができます。例えば
、
def test():
a2 = list(a)
a2.remove(1)
リストは、それらが変更されることを意図されている、可変オブジェクトです。変更を禁止する場合は、代わりにタプル(例:a = (1, 2)
)に変換してください。タプルは不変なので、変数をコピーして再割り当てせずにタプルを変更することはできません。
リストa
がグローバル名前空間に存在するため、remove
を呼び出すと、値1
が削除されます。
変更したくない場合は、新しいリストを作成するだけです。リストa
にremove
を呼び出すと、もちろん値を削除します。
次回はコードの書式設定を使用し、質問を投稿する前にプレビューをご覧ください。 – AndiDog
これはグローバル変数を使用しています。このようなコード例はどこで見たことがありますか? –