我为什么要提到“我的”呢;名称“;及;“有约束力”;在Python中,而不是;变量“;及;转让;?

我为什么要提到“我的”呢;名称“;及;“有约束力”;在Python中,而不是;变量“;及;转让;?,python,Python,为什么我要在Python中引用“名称”和“绑定”,而不是“变量”和“赋值”? 我知道这个问题有点笼统,但我真的很想知道:)我想说,由于C和Python之间的一些差异,这种区别是非常重要的: Duck类型:C变量始终是给定类型的实例-在Python中,名称引用的类型不能更改 浅复制-请尝试以下操作: >>> a = [4, 5, 6] >>> b = a >>> b[1] = 0 >>> a [4, 0, 6] >>

为什么我要在Python中引用“名称”和“绑定”,而不是“变量”和“赋值”?
我知道这个问题有点笼统,但我真的很想知道:)

我想说,由于C和Python之间的一些差异,这种区别是非常重要的:

  • Duck类型: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不要使用可变的默认值