3

重複の可能性:
Pythonでリストを複製する方法は?

興味深い結果を見つけました

a = [1, 2] 
b=a 
b.append(3) 
print a, b

#=> [1,2,3] [1,2,3]


a = [1, 2] 
b=a 
b += [3] 
print a, b

#=> [1,2] [1,2,3]

一部の操作で参照値が変更され、一部の操作で新しい値が作成されたようです。!Ruby では、この破壊的な性質を持つメソッドを示すために使用できることを覚えています。Pythonには、それらを区別できる同様の方法がありますか? または、最も一般的に使用されるものをすべて表示するリストを提供しますか?

4

2 に答える 2

1

ここでのいくつかの既存の回答とは対照的に、本当の理由は実際には反対です。Python で自分自身+=を変更するインプレース演算子であることを意図しています。しかし、それにはいくつかの問題があります。


タプルや文字列などの不変型の場合、my_tuple += (1, )新しいmy_tuple = my_tuple + (1, )オブジェクトを作成し、それを に代入します:my_tuple

>>> my_tuple = (1,2,3)
>>> t = my_tuple
>>> t += (2,)
>>> t
(1, 2, 3, 2)
>>> my_tuple
(1, 2, 3)

これは、タプルや文字列などの不変型が実装されていないため__iadd__です (例で確認できますdir(tuple))。この場合、__add__代わりにフォールバックして使用します。これにより、新しいオブジェクトが作成され、元の変数に割り当てられます。


ただし、リストや辞書などの一部の変更可能な型で__iadd__は が実装されており、+=代わりにそれを呼び出します。

>>> inspect.getdoc(list.__iadd__)
'x.__iadd__(y) <==> x+=y'

>>> a = [1,2,3]
>>> b = a
>>> b += [4]
>>> b
[1, 2, 3, 4]
>>> a
[1, 2, 3, 4]

したがって、変更可能な型の場合、このインプレース操作は ( selfを変更することによって) 実行され、元のオブジェクトは update されます。

于 2012-10-30T09:15:14.773 に答える
0

命名規則はありません。

ただし、オブジェクトを変更するメソッドはNoneを返し、新しいオブジェクトを作成するメソッドはそのオブジェクトを返すという使用法があります。

于 2012-10-30T08:45:36.270 に答える