您的位置:首页 > 编程语言 > Python开发

Python 核心编程笔记_Chapter_4_Note_1 对象属性

2016-06-29 15:34 441 查看

关于对象本身的布尔值,这个原来不知道,扫盲了。

布尔值

所有标准对象均可用于布尔测试,同类型的对象之间可以比较大小。每个对象天生具有布

尔 True 或 False 值。空对象、值为零的任何数字或者Null 对象 None 的布尔值都是False。

下列对象的布尔值是False。

None

False (布尔类型)

所有的值为零的数:

0 (整型)

(浮点型)

0L (长整型)

0.0+0.0j (复数)

"" (空字符串)

[] (空列表)

() (空元组)

{} (空字典)

值不是上面列出来的任何值的对象的布尔值都是 True,例如non-empty、 non-zero 等等。

用户创建的类实例如果定义了nonzero(__nonzero__())或length(__len__())且值为0,那

么它们的布尔值就是 False。



接下来一点我们讲对象值的比较,很重要,为什么呢?因为他还牵涉到对象在内存中的规则

标准类型运算符

4.5.1 对象值的比较

比较运算符用来判断同类型对象是否相等,所有的内建类型均支持比较运算,比较运算返

回布尔值 True 或 False。如果你正在使用的是早于 Python2.3 的版本,因为这些版本还没有

布尔类型,所以会看到比较结果为整型值 1 (代表True)或 0 (代表False)。

注意,实际进行的比较运算因类型而异。换言之,数字类型根据数值的大小和符号比较,

字符串按照字符序列值进行比较,等等。

>>> 2 == 2

True

>>> 2.46 <= 8.33

True

>>> 'abc' == 'xyz'

False

>>> 'abc' > 'xyz' 这里标蓝的意思是,字符串也能比较,应该是按照排序来比较,也可能是根据编码的大小来排的,后续自己查吧

False


>>> 'abc' < 'xyz'

True


>>> [3, 'abc'] == ['abc', 3] 这里标红的意思是,列表的比较,顺序需要一样,这一点原来不知道

False

>>> [3, 'abc'] == [3, 'abc']

True


不同于很多其它语言,多个比较操作可以在同一行上进行,求值顺序为从左到右。

>>> 3 < 4 < 7 # same as ( 3 < 4 ) and ( 4 < 7 )

True

>>> 4 > 3 == 3 # same as ( 4 > 3 ) and ( 3 == 3 )

True

>>> 4 < 3 < 5 != 2 < 7

False

我们会注意到比较操作是针对对象的值进行的,也就是说比较的是对象的数值而不是对象

本身。在后面的部分我们会研究对象身份的比较。

对象身份比较

作为对值比较的补充,Python 也支持对象本身的比较。对象可以被赋值到另一个变量(通

过引用)。因为每个变量都指向同一个(共享的)数据对象,只要任何一个引用发生改变,该对

象的其它引用也会随之改变。

为了方便大家理解,最好先别考虑变量的值,而是将变量名看作对象的一个链接。让我们

来看以下三个例子:

例1: foo1 和 foo2 指向相同的对象

foo1 = foo2 = 4.3

当你从值的观点看这条语句时, 它表现的只是一个多重赋值,将4.3 这个值赋给了foo1

和foo2 这两个变量。这当然是对的, 不过它还有另一层含义。 事实是一个值为4.3 的数字对

象被创建,然后这个对象的引用被赋值给foo1 和foo2, 结果就是 foo1 和 foo2 指向同一个对

象。图4-1 演示了一个对象两个引用。



图4–1 foo1 和 foo2 指向相同的对象

例2: foo1 和 foo2 指向相同的对象

foo1 = 4.3

foo2 = foo1

这个例子非常类似上一个,一个值为4.3 的数值对象被创建,然后赋给一个变量, 当执行

foo2 = foo1 时, foo2 被指向foo1 所指向的同一个对象, 这是因为Python 通过传递引用来

处理对象。foo2 就成为原始值4.3 的一个新的引用。 这样foo1 和foo2 就都指向了同一个对

象。示意图也和图4-1 一样。

例3: foo1 和 foo2 指向不同的对象

foo1 = 4.3

foo2 = 1.3 + 3.0

这个例子有所不同。首先一个数字对象被创建,然后赋值给foo1. 然后第二个数值对象被

创建并赋值给foo2. 尽管两个对象保存的是同样大小的值,但事实上系统中保存的都是两个独

立的对象,其中foo1 是第一个对象的引用, foo2 则是第二个对象的引用。图4-2 演示给我

们这里有两个不同的对象,尽管这两个对象有同样大小的数值。 我们为什么在示意图中使用盒

子?没错,对象就象一个装着内容的盒子。当一个对象被赋值到一个变量,就象在这个盒子上

贴了一个标签,表示创建了一个引用。每当这个对象有了一个新的引用,就会在盒子上新贴一

张标签。当一个引用被销毁时, 这个标签就会被撕掉。当所有的标签都被撕掉时, 这个盒子

就会被回收。那么,Python 是怎么知道这个盒子有多少个标签呢?



图4–2 foo1 和 foo2 指向不同的对象

每个对象都天生具有一个计数器,记录它自己的引用次数。这个数目表示有多少个变量指

向该对象。这也就是我们在第三章3.5.5-3.5.7 小节提到的引用计数。Python 提供了is 和is not

运算符来测试两个变量是否指向同一个对象。象下面这样执行一个测试

a is b

这个表达式等价于下面的表达式

id(a) == id(b)

对象身份比较运算符拥有同样的优先级,表4.2 列出了这些运算符。在下面这个例子里,

我们创建了一个变量,然后将第二个变量指向同一个对象。

>>> a = [ 5, 'hat', -9.3]

>>> b = a

>>> a is b

True

>>> a is not b

False

>>>

>>> b = 2.5e-5

>>> b

2.5e-005

>>> a

[5, 'hat', -9.3]

>>> a is b

False

>>> a is not b

True

is 与 not 标识符都是 Python 关键字。

运算符 功能

obj1 is obj2 obj1 和obj2 是同一个对象

obj1 is not obj2 obj1 和obj2 不是同一个对象
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 核心编程 对象