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



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

布尔值
所有标准对象均可用于布尔测试,同类型的对象之间可以比较大小。每个对象天生具有布
尔 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           不是同一个对象




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值