我为什么要提到“我的”呢;名称“;及;“有约束力”;在Python中,而不是;变量“;及;转让;?
为什么我要在Python中引用“名称”和“绑定”,而不是“变量”和“赋值”?我为什么要提到“我的”呢;名称“;及;“有约束力”;在Python中,而不是;变量“;及;转让;?,python,Python,为什么我要在Python中引用“名称”和“绑定”,而不是“变量”和“赋值”? 我知道这个问题有点笼统,但我真的很想知道:)我想说,由于C和Python之间的一些差异,这种区别是非常重要的: Duck类型:C变量始终是给定类型的实例-在Python中,名称引用的类型不能更改 浅复制-请尝试以下操作: >>> a = [4, 5, 6] >>> b = a >>> b[1] = 0 >>> a [4, 0, 6] >>
我知道这个问题有点笼统,但我真的很想知道:)我想说,由于C和Python之间的一些差异,这种区别是非常重要的:
>>> a = [4, 5, 6]
>>> b = a
>>> b[1] = 0
>>> a
[4, 0, 6]
>>> b = 3
>>> a
[4, 0, 6]
这是有道理的,因为
a
和b
都是花费一定时间绑定到列表实例的名称,而不是单独的变量。例如,在C中,变量是内存中由特定名称标识的位置。例如,inti
表示有一个由i
标识的4字节(通常)变量。无论是否为其分配了值,都会分配此内存位置。当C运行i=1000
时,它将存储在内存位置i
中的值更改为1000
在python中,内存位置和大小与解释器无关。python最接近C意义上的“变量”是一个值(例如1000),它作为对象存在于内存中的某个位置,有或没有附加名称。通过
i=1000将其绑定到名称。这告诉python创建一个值为1000的整数对象(如果它还不存在),并绑定到名称“i”。一个对象可以很容易地绑定到多个名称,例如:
>>> a = [] # Create a new list object and bind it to the name 'a'
>>> b = a # Get the object bound to the name 'a' and bind it to the name 'b'
>>> a is b # Are the names 'a' and 'b' bound to the same object?
True
这就解释了术语之间的区别,但只要你理解了区别,你使用哪一个并不重要。除非你很迂腐。谁说你应该这么做?除非您正在讨论与名称绑定操作直接相关的问题;像在任何其他语言中一样,在Python中讨论变量和赋值是非常好的。当然,在不同的编程语言中,精确的含义是不同的
如果您正在调试与“命名和绑定”相关的问题,那么请使用此术语,因为Python语言参考使用它:尽可能具体和精确,通过避免不必要的歧义来帮助解决问题
另一方面,如果您想知道C和Python中变量之间的区别,那么。我不确定名称/绑定描述是最容易理解的,例如,即使我对Python(尤其是cpython)的工作原理有一些准确的理解,我也总是被它弄糊涂
如果您来自C语言背景,描述Python如何工作的最简单方法是理解Python中的所有变量实际上都是指向对象的指针,例如列表
对象实际上是指向值的指针数组。在a=b
之后,a
和b
都指向同一个对象
这个简单的Python语义模型有几个棘手的地方似乎失败了,例如使用list
augmented操作符++=
,但要注意的是,Python中的a+=b
与a=a+b
不同,但它是一个特殊的增量操作(也可以使用方法为用户类型定义;a+=b
实际上是a=a.\uu iadd\uu(b)
)
另一个重要的事情是,在Python中,所有变量都是指针,但仍然没有指针概念。换句话说,不能将“指针指向变量”传递给函数,以便函数可以改变变量:C++中定义的是
中的什么内容。
void increment(int &x) {
x += 1;
}
或在C中由
void increment(int *x) {
*x += 1;
}
在Python中无法定义,因为无法传递“变量”,只能传递“值”在Python中传递通用可写的唯一方法是使用回调闭包。< P>在C和C++中,变量是一个命名的内存位置。变量的值是存储在该位置的值。赋值给变量,然后修改该值。因此变量是内存位置,而不是它的名称。< /P>
在Python中,变量是用于引用对象的名称。变量的值就是该对象。到目前为止,听起来是一样的。但是分配给变量,您不会修改对象本身,而是更改变量引用的对象。因此,变量是名称,而不是对象
出于这个原因,如果您在抽象中考虑Python的属性,或者同时讨论多种语言,那么为这两种不同的东西使用不同的名称是很有用的。为了保持简洁,您可能会避免在Python中讨论变量,而将赋值运算符所做的操作称为“绑定”而不是“分配”
请注意,“赋值”是一种语句,而不是“绑定”。至少在一些Python文档中是这样。因此,仅在Python上下文中,这样做并不是不正确的。行话的不同定义适用于不同的上下文。因为..它就是这样..名称就是名称,它被绑定在某个地方“应该”只有在你关心学究们骚扰你的时候才会这样做。重要的不是你如何引用他们,而是你是否理解他们在Python中是如何工作的。谁告诉你应该这样做的?这是从哪里来的?我总是使用“变量”和“赋值”"。在解释语义时,我通常会谈论引用事物的名称,以及我此刻喜欢的任何术语。在Python中,您不需要在变量中放入值,而是将值绑定到标签。。我认为^^。区别并没有那么有用,因为了解其他语言中的引用以及一些try/fail/re不要使用可变的默认值