0
a = [1]

def do():
    global a
    b=a
    print b
    a[0] = 2
    print b

do()

出力: 1 2

「a」がグローバルリストであるという事実と関係があると確信しています。グローバルが変更されたときに変数 b が変更される理由を誰かに説明してもらえますか。そして、どうすればそれが起こらないようにすることができますか?

質問の拡張: 次のようなネストをどのように処理しますか?

a = []
b = []
def do():
    global a, b
    b.append(a[:])
    print a, b
    a[0][0] +=1
    print a, b

a.append([1])
do()
4

3 に答える 3

1

この行b=aでは、基本的に a を指す参照 b を作成します。Python のこれは、リストの新しいコピーを作成するのではなく、リストへの新しいリンクを作成するだけです。

のコピーを作成する場合aは、明示的に行う必要があります。リスト内包表記を使用すると、次のように実行できます。

b = a[:]

これにより、b によって参照される a のコピーが作成されます。実際に見てみましょう:


>>> a = [1]
>>> b = a #Same list
>>> a[0] = 2
>>> b
[2] #Problem you are experiencing

それらが同じオブジェクトを参照しているかどうかは、次の方法で確認できます。

>>> a is b
True

true は、それらが同じオブジェクトを参照していることを示します。

>>> b = a[:] #Solution <<--------------

同じテストをもう一度行う:

>>> a is b
False

そして問題は解決しました。それらは現在、異なるオブジェクトを参照しています。

>>> b
[2]
>>> a[0] = 3 #a changed
>>> a
[3]
>>> b
[2] #No change here
于 2013-01-13T07:36:54.930 に答える
0

を割り当てるb = aと、 に保持されているリスト オブジェクトへの参照がコピーされるaためb、それらは同じリストを指します。基になるオブジェクトへの変更は、いずれかの参照によって反映されます。

リストのコピーを作成する場合は、

b = list(a)

または、ほとんどのオブジェクトで機能するメソッド:

import copy
b = copy.copy(a)
于 2013-01-13T07:43:53.927 に答える
0

Pythonの変数モデルを誤解していると思います。これは私が読んだ記事であり、私にとってはクリックになりました(セクション「他の言語には変数があります」および「Pythonには名前があります」)。

于 2013-01-13T07:47:38.400 に答える