2

Python の名前バインディングとは何か、またこのバインディングがいつ解釈されるかを理解しようとしています。

cでは、

include <stdio.h>
int main()
{
int X = 42;
int* Y[1];
Y[0] = &X;
X = 666;
printf("%d", *Y[0]);
return 0;
}

666 を出力します。私は Python コードのブロックを期待していました:

X = 42
L = []
L.append(X) #3
X = 666
print(L) #5

同じことをしますが、そうではありません。3 と 5 のラベルが付いた行の間で正確に何が起こるでしょうか? #3は、Xのように「42」として知られるオブジェクトへの別の参照を作成し、それをX'と呼び、X'をLが指すオブジェクト[]に格納しますか?

4

1 に答える 1

5

あなたが述べていることは、ほとんど何が起こるかです:

X = 42               # Create new object 42, bind name X to it.
L = []
L.append(X)          # Bind L[0] to the 42 object.
X = 666              # Create new object 666, bind name X to it.
print(L)             # Will not see the 666.

は配列要素を にバインドするのappendではなく、 X の背後Xにあるオブジェクトにバインドします。これはです。42

これが Python の仕組みであることに初めて気付いたとき、物事 (具体的には、以前は私を混乱させ、多くの不安と歯ぎしりを引き起こしたこのようなこと) が非常に明確になりました。

于 2015-10-14T01:36:48.127 に答える