このコードが意図したとおりに動作しない理由を理解するのにしばらく時間を費やすまで、私は常にx += 1
構文上の省略形 (およびまったく同等)だと思っていました。x = x + 1
[ipython/euler 72 ]$ def func(mylist):
mylist += random.sample(range(100),2)
# do stuff with the random result, then restore original list
mylist = mylist[:-2]
取得したのと同じリストを返すはずですが、そのようには機能しないようです:
[ipython/euler 81 ]$ x = [1,2,3]
[ipython/euler 82 ]$ func(x)
[1, 2, 3, 23, 7]
[ipython/euler 83 ]$ func(x)
[1, 2, 3, 23, 7, 42, 36]
[ipython/euler 84 ]$ func(x)
[1, 2, 3, 23, 7, 42, 36, 0, 5]
割り当てステートメントを長い形式に変更するmylist = mylist + ...
と、期待どおりに機能し、リストは変更されません。
なぜこうなった?リストのオーバーロードされたメソッドとして呼び出されたときにリストが変更可能であり、おそらく iadd が「実際の」追加ではないことに関係していると思いますが、それでもインタープリターがそれらを同等と見なすことを期待していました。