2

Python を使い始めたばかりで、リスト内包表記を使用して 2 つのリストを初期化しようとしています。このような

list1 = list2 = [0.0] * 57

これを行ってこれらのリストに値を挿入すると、これらのリストを個別に初期化したときに取得する値と比較すると、異なる値のセット (不正な値) が取得されます。お気に入り

list1 = [0.0] * 57
list2 = [0.0] * 57

最初のケースで何が起こっていますか? これら 2 つのケースで異なる回答が得られるのはなぜですか?

4

2 に答える 2

6

最初のセットlist1list2両方が同じリストを参照します。2 番目のものは、名前ごとに新しいリストを定義します。

于 2013-10-04T20:06:04.107 に答える
4

次のケースでは、1 つのリストを作成し、2 つの変数がそれを指すようにしています。つまり、同じオブジェクトへの 2 つの参照:

list1 = list2 = [123] * 3
list1.append(456)

print list1 =>  # prints [123, 123, 123, 456]
print list2 =>  # prints [123, 123, 123, 456]
print list1 is list2   # prints True

list1一方、これは 2 つの新しいリストを作成し、1 つをに、もう1 つを に割り当てますlist2

list1 = [123] * 3
list2 = [123] * 3
# or  list1, list2 = [123] * 3, [123] * 3

list1.append(456)

print list1  # prints [123, 123, 123, 456]
print list2  # prints [123, 123, 123]
print list1 is list 2  # prints False

これは、値が参照によって変数にコピーされるか格納されるかに関係しています。整数や文字列などの不変オブジェクトの場合、これは問題になりません。

# a and b contain the same int object
# but it's OK because int's are immutable
a = b = 1
a += 2  # creates a new int from 1+2 and assigns it to `a`
print b  # => 1  ... b is unchanged
print a  # => 3

言い換えれば、ints (またはfloats やstrs など) には、メソッドを呼び出している値を変更するメソッドはありません。代わりに、それらはすべてその型の新しいインスタンスを返します。そのため、変更された既存の int ではなく、-5新しい int を返します。また、is where (つまり、a で呼び出されたメソッド) は、値が である新しい int を返し、それへの参照が に割り当てられます。-55a += 2a = a + 2a + 2__add__a + 2a

于 2013-10-04T20:08:34.197 に答える