6

最初はみんなと同じように始めます。私はpythonが初めてです。私の先生は私に問題を出しました:

def f(a, b, c):  
    a    = 1 
    c    = b 
    c[0] = 2 
a = 10 
b = [11, 12, 13] 
c = [13, 14, 15] 
f(a, b, c) 
print a, b, c

それは印刷します:

10 [2, 12, 13] [13, 14, 15]

整数は不変であるため、a が 10 のままであることは理解していますが、b が変化し、c が変化しない理由がわかりません。

4

3 に答える 3

4
c    = b 
c[0] = 2

cを指すように設定しているので、これをb同じように簡単に行うことができます。

def f(a, b, unused): # notice c isn't in the parameter list  
    a = 1
    c = b # c is declared here
    c[0] = 2 # c points to b, so c[0] is b[0]

cこれは常にと同じであることは明らかですb。それで、単にそれを削除しないのはなぜですか。

def f(a, b, unused):
    a = 1
    b[0] = 2

そして今、あなたがの最初の要素を変更していて、b何もしていないことは明らかですc、そしてこれは機能的に元のものと同じであることを覚えておいてください。

于 2011-12-06T21:28:09.337 に答える
2

重要なのは、変数を内部のポインターとして理解することです。

def f(a, b, c):  
    a    = 1 # a is a single scalar value, so no pointing involved
    c    = b # point the local "c" pointer to point to "b"
    c[0] = 2 # change the 2nd value in the list pointed to by "c" to 2

f(a、b、c)を呼び出すと、実際にはbのみが変更されます。関数実装内の「c」変数は、関数外の「c」実装とは異なります。

于 2011-12-06T21:30:54.987 に答える
1

a不変であるため、10の値を保持しません。a = 1ローカルスコープを呼び出すとf()新しい変数が作成されるため、値は10のままです。

c = b内部を呼び出すと、 f()localは。cで表される可変オブジェクトへのローカル参照になりますb。その可変オブジェクトの値を再割り当てすると、変更は元のオブジェクトに反映されます。

于 2011-12-06T21:30:57.947 に答える