Python;名称绑定不是对象引用?
Python; name bindings are not object references?
我想了解 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 是否使 另一个 引用称为“42”的对象,如 X,我们称它为 X',并将 X' 存储在 L 指向的对象中,即 [] ?
你说的是几乎会发生什么:
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 的工作方式时,事情(具体来说,以前让我感到困惑并引起很多焦虑和咬牙切齿的事情)变得更加清晰。
我想了解 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 是否使 另一个 引用称为“42”的对象,如 X,我们称它为 X',并将 X' 存储在 L 指向的对象中,即 [] ?
你说的是几乎会发生什么:
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 的工作方式时,事情(具体来说,以前让我感到困惑并引起很多焦虑和咬牙切齿的事情)变得更加清晰。