Python in nutshell 2nd 简明翻译 (2)

4.3 变量与引用

引用是指向到内存中数值地址的一个名字。变量引用没有初始类型,它依赖于程序运行时与它绑定的值对象的类型,且可以通过多次赋值进行改变。

4.3.1 变量

变量不需要申明,它在赋值语句进行绑定时自动产生,del语句用来解除绑定。

对引用进行重绑定并不会影响到它们所绑定的对象,如果一个对象没有任何引用绑定到它上面,则由垃圾回收机制负责销毁它。

变量可以使用除30个保留字外的任何名字。变量分为全局与局部变量两种,如module的属性就是全局变量,而函数内部的变量则是局部变量。

4.3.1.1 对象属性与元素

对象属性与对象元素间的唯一区别是你存取它们时所使用的语法。

对象属性: x.y 对象名 + 点操作符 + 属性名

对象元素: x[index/key] 对象名[元素索引/元素键值]

可调用的对象属性就是对象方法。

4.3.1.2 存取不存在的引用

Python编译不会对语义进行检查,而只对语法进行检测,所以存取不存在的引用将会引发一个运行时异常。



4.3.2 赋值语句

普通赋值语句: name = value 创建一个变量name,或重绑定name到值value上。

x.attr = value 创建对象x的属性attr,或重绑定attr到值value上。

x[k] = value 创建对象x的元素k,或重绑定元素k到值value上。

增量赋值语句: name += value

增量赋值操作本身并不会创建新的对象,其结果是绑定到一个新对象上还是修改属性值后的原对象,都依赖于被操作的对象本身(即此对象是否为不变对象)。

4.3.2.1 普通赋值

target = expression Python对表达式expression进行运算,将target与此值进行绑定。在Python中,可调用对象与不可调用对象的赋值操作并没有本质上的区别,这就是说,你可以将函数、方法、类型赋值给一个变量,这种操作与将一个数字、字符串赋值给变量没有任何区别。

其中target可以有多种可能的类型:

identifer 普通标识符 直接指定变量名 identifer = expression

attribute 对象属性引用 赋值到对象的属性 obj.name = expression

indexing 对象元素索引 赋值到对象的指定元素 obj[expr] = expression

slicing 容器片断 赋值到容器对象的片断 obj[start:stop] or obj[start:stop:stride]

除了第一种情况之外,其它的赋值都是针对对象的属性或元素,对象也可以拒绝相应的操作,并抛出异常(请参见__setattr____setitem__)。

多重赋值: a = b = c = 0 在此情况中,表达式只会被计算一次,所有变量都被绑定到同一个表达式计算结果上,在此例中是0

拆包赋值: a, b, c = x 在此情况中,x必须是可迭代对象,a b c分别按顺序得到值。同时,x中必须有且只能有三个项目,否则将导致异常。利用拆包赋值可以达到交换变量值的目的,如a, b = b, a

4.3.2.2 增量赋值

在一个二元操作符后跟 = 就可以进行增量赋值。

增量操作符有:+=, -=, *=, /=, //=, %=, **=, |=, >>=, <<=, &=, ^=

增量赋值不支持多重赋值。

在增量操作中,Python首先对右表达式进行运算,如果左值是一个对象,且此对象拥有与此操作符相对应的特定内置方法(可以理解为操作符重载),则Python会以右值作为参数调用左值的相应操作符方法,来修改此对象。若此对象无对应的内置方法,则Python按普通的二元操作进行处理。

如对于 x += y,若有内置方法,则调用 x.__iadd__(y),否则,x = x + y

增量赋值永远不会创建一个新的引用,赋值表达式的左值必须是已绑定的变量,而增量赋值操作可以重新绑定左值到新的对象,或修改由左值所表示的对象。与此相比,普通赋值要么创建一个新引用,要么重新绑定变量,而从来不会修改左值原来所引用的对象。

如对于 x = x + y,赋值操作将会将变量x与一个新对象绑定,而不会改变x原来所引用的对象。而对于 x += y,若x对象有特定内置方法__iadd__,则Python调用此方法修改x对象,若没有此特定方法,则效果与x = x+y 一样,都进行重绑定操作。



4.3.3 del语句

del并不如其字面意思,删除一个对象,它只是解除变量与值之间的引用关系。对象的删除只有在没有任何引用存在的情况下由垃圾回收器完成。

del语句由del关键字后加引用(也可以是一组由逗号分隔的引用)组成。引用的类型包括变量,对象属性,对象元素,容器对象的片断。

对于普通的变量,del操作总是会解除引用关系。

对于对象属性或元素,此对象可以拒绝解除操作并引发异常,依赖于对象的__delattr____delitem__方法。

对于窗口对象片断,默认的处理是将此片断用一个空序列替代,但具体实现也依赖于此容器对象。



 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值