结论
先说结论,赋值操作符 = 实际上有 2 个作用:
- 绑定 binding。即将变量和内存中的数据进行绑定。
- 修改可变对象的元素。
下面详细看看这 2 个作用。
1. 绑定 binding
绑定是指将一个变量和内存中的数据进行绑定。此时这个变量也叫做引用 reference 。
绑定时,有直接绑定和间接绑定两种方式。间接绑定也叫“取别名” aliasing,就是通过 b = a 的方式,将 b 和数据进行绑定,并且这个数据是 a 所指向的数据。示例如下图。
上面用到了 id() 函数,它返回的是对象的 id,相当于对象的身份证。在 CPython 中,用内存地址作为对象的 id。
1.1 UnboundLocalError
有时在函数中,会遇到 UnboundLocalError。这个报错的意思是指:一个 local 局部变量,没有和数据进行绑定,也就是还没有对变量进行赋值,所以是 unbound 状态。如下图。
如果是在函数外部的全局变量区,使用未绑定数据的变量,也会发生同样性质的报错,只不过此时报错的名称是 NameError,如上图。但它的本质和 UnboundLocalError 是一样的,即变量没有和数据进行绑定。
2. 修改可变对象的元素
= 的第二个作用,是修改可变对象 mutable 的元素。此时 id 不会变。(可变对象包括列表,字典等。不可变对象则是数字,字符串,元祖等)
此时 = 左边是可变对象的一个元素,右边是数据。实际是执行特殊方法 setitem 。示例如下。
3. 赋值操作符 = 的执行顺序
最后提一下,在执行赋值操作符 = 时,是有先后顺序的,3 个步骤如下:
- 先生成 = 右边的数据。
- 然后创建 = 左边的变量(或是找到 = 左边可变对象的元素)。
- 最后才是进行绑定操作(或者修改元素)。
—————————— 本文结束 ——————————