私はPythonリストを次のように作成します
>>> list1 = ['a', 'b', 'c']
とセット
>>> list2 = list1
今、私は2つの同様の操作を実行list1
し、list2
>>> list1 = list1 + [1, 2, 3]
>>> list1
['a', 'b', 'c', 1, 2, 3]
>>> list2
['a', 'b', 'c']
そして
>>> list2 += [1,2,3]
>>> list1
['a', 'b', 'c', 1, 2, 3]
>>> list2
['a', 'b', 'c', 1, 2, 3]
ただし、どちらの場合も結果は異なります。その理由は何ですか?
この背後にある理由は、クラスの2つの異なるメソッド、methodとmethod+=
を+
呼び出すためです。__iadd__
__add__
APIの観点からは、iaddは、変更可能なオブジェクトを適切に変更する(変更されたオブジェクトを返す)ために使用されることになっていますが、addは何かの新しいインスタンスを返す必要があります。不変オブジェクトの場合、どちらのメソッドも新しいインスタンスを返しますが、iaddは、古いインスタンスと同じ名前で現在の名前空間に新しいインスタンスを配置します。これが理由です
i = 1
i += 1
iをインクリメントするようです。実際には、新しい整数を取得し、それをiの「上」に割り当てます。つまり、古い整数への参照が1つ失われます。この場合、i + = 1はi = i + 1とまったく同じです。ただし、ほとんどの可変オブジェクトでは、話が異なります。
具体的な例として:
a = [1, 2, 3]
b = a
b += [1, 2, 3]
print a #[1, 2, 3, 1, 2, 3]
print b #[1, 2, 3, 1, 2, 3]
に比べ:
a = [1, 2, 3]
b = a
b = b + [1, 2, 3]
print a #[1, 2, 3]
print b #[1, 2, 3, 1, 2, 3]
最初の例では、bと参照が同じオブジェクトを参照しているため、bで+ =を使用すると、実際にbが変更されます(そして、aもその変更を確認します-結局のところ、同じリストを参照しています)。ただし、2番目のケースでは、b = b + [1、2、3]を実行すると、bが参照しているリストが取得され、新しいリスト[1、2、3]と連結されます。次に、連結されたリストを現在の名前空間にbとして格納します-以前の行が何であったかは関係ありません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加