2017-08-23 14 views
-1

を参照しない:両方のアイドル上で実行されたときしかしPythonは以下のコードで同じリストに

[0,1] 

:として

[0,1,0,1,0,1] 

及びB:

a=[0,1] 
b=a 
for i in range(2): 
    for j in b: 
     a=a+[j] 

理由として、印刷を行いますリストの変更:

>>> c=[9,0] 
>>> d=c 
>>> d+=[7] 
>>> c 
[9, 0, 7] 

aが追加されているので、なぜpythonリストの割り当てのプロパティが変更されないのですか?

+8

なぜ 'b'が変わると思いますか? *新しい*リストを作成するたびに、あなたが*追加しないで*追加して、それを 'a'に割り当てます。 –

+1

'a 'の再割り当てを避けるために' a = a + [j] 'を' a.append(j) 'に変更しました – Alexander

答えて

10

はPythonのリストの割り当てのプロパティであるとしてしないのはなぜb変更を付加していますか?

aは特許ないです。あなたが書くとき:

a = a+[j] 

あなたがするたびにリスト[j]を構築し、その後a、その後jのすべての要素が含まれてい新しいリストa+[j]を構築します。

aは新しいリストを参照しますが、bはまだは古いリストを参照しています。古いリストは更新されないため(状態は変更されません(例:appendなど)、リストは同じままです(変更したリストを反復処理すると望ましくない副作用が発生する可能性があります)。あなたの代わりにa = a + [j]a.append(j)またはa += [j]を使用する場合は、リストが更新さなります

(後者の場合には、あなたが暗黙的にa.extends([j])を呼び出します)。 abの両方がそのリストを参照するため、bも更新されます。しかし、同時にbを反復処理するので、無限ループに終わる可能性があることに気をつけてください。とにかくそれをしないほうがいい。

+0

私の答えよりも良い=)削除しました。それを行う正しい方法ですか? – slezica

+0

@slezica: 'append'はオブジェクトの反復処理中にオブジェクトの状態を変更するので、正しい方法とは言いません。 1つは間違いなくこのアドバイスではありません。 –

+0

真実は、気にしないでください – slezica

5

aは追加されません。追加はとても似appendコマンドを使用して行われます。

a.append(1) 

たび、あなたは新しいオブジェクトを作成(a + [j])を追加します。 a以来

関連する問題