4-1:Python对象。与所有Python对象有关的三个属性是什么?请简单的描述下。
答:身份、类型、值
1)身份:每一个对象都有惟一的身份标识自己。任何对象的身份都可以通过内建函数 id( ) 得到。这个值可以被认为是该对象的内存地址。
2)类型:对象的类型决定了该对象可以保存什么类型的值,可以进行什么操作,以及遵循什么规则。可以通过内建函数 type( ) 查看Python对象的类型。[ 因为在Python 中类型也是对象,所以type( )返回大是对象而不是简单大字符串 ]
3)值:对象表示的数据项。
4-2:类型。不可更改 (immutable) 指的是什么?Python的哪些类型是可以更改 (mutable) ,哪些不是?
对象创建成功之后,其值不可以更新,这些对象称为不可变对象 ; 而另一类对象创建后,其值允许改变,称为可变对象。
可变类型:列表、字典
不可变类型:数字、字符串、元组
摘自:http://fightlife2012.blog.163.com/blog/static/203582288201292324613791/
如: i = 0;
i = i + 1;
实际其引用的对象已经被改变,利用内置函数id()可以明确获悉其引用对象的id值改变
即可以理解为 i = 0时 0为创建了一个整形对象, 当 i = i + 1后,i + 1又新创建了一个整形对象,新创建的对象被关联到原来的变量名,原来引用的整形对象被丢弃,由于原来对象的引用计数将会归0,垃圾回收器在适当时机进行回收。
4–3.类型。哪些 Python 类型是按照顺序访问的,它们和映射类型的不同是什么?
答:顺序访问类型:字符串、列表、元组。映射访问的类型:字典。
序列类型是指容器内的元素按从 0 开始的索引顺序访问。一次可以访问一个元素或多个元
素, 也就是大家所了解的切片(slice)。字符串, 列表和元组都归到这一类。
映射类型类似序列的索引属性,不过它的索引并不使用顺序的数字偏移量取值, 它的元素
无序存放, 通过一个唯一的 key 来访问, 这就是映射类型, 它容纳的是哈希键-值对的集合。
4–4.type()。内建函数 type()做什么?type()返回的对象是什么?
答:用法:type(object)
type() 接受一个对象做为参数,并返回它的类型。它的返回值是一个类型对象。
>>> type(type(42))
所有类型对象的类型都是 type,它也是所有 Python 类型的根和所有 Python 标准类
的默认元类(metaclass)。
4–4.str() 和 repr()。内建函数 str()与 repr()之间的不同是什么?哪一个等价于反引号(``)运算符?。
答:
内建函数 str() 和 repr() 或反引号运算符(``) 可以方便的以字符串的方式获取对象的
内容、类型、数值属性等信息。
str()函数得到的字符串可读性好, 输出对人机友好。其返回值通常无法用于eval求值
而 repr()函数得到的字符串通常可以用eval来重新获得该对象
repr( ) <==> (` `)
4–6.对象相等。您认为 type(a) == type(b)和 type(a) is type(b)之间的不同是什么?为什么会选择后者?函数 isinstance()与这有什么关系?
答:
对于type(a) == type(b),比较操作符 == 是对两边对象的值进行比较的,也就是说,比较的是对象的数值而不是对象本身。
对于 type(a) is type(b),等价于id(type(a)) == id(type(b)),其两边都指向一个共享的数据对象等式才成立。
这样做是为了优化代码性能。我们用对象身份的比较来替代对象值的比较。如果对象是不同的,那意味着原来的变量一定是不同类型的。(因为每一个类型只有一个类型对象),我们就没有必要去
检查(值)了。 一次这样的调用可能无关紧要,不过当很多类似的代码遍布在应用程序中的时候,就有影响了。
isinstance( )函数,由名字可以知道,是否是某个类型的实例,用于判断对象的类型:
举个例子:
#!/usr/bin/env python
def displayNumType(num):
print num, 'is',
if isinstance(num, (int, long, float, complex)):
print 'a number os type:', type(num).__name__
else:
print 'not a number at all!!!'
dispalyNumType(-66)
dispalyNumType(99999999999999999999999999L)
dispalyNumType(98.6)
dispalyNumType(-5.2+1.9j)
dispalyNumType('xxx')
4-7.内建函数 dir()。在第二章的几个练习中,我们用内建函数 dir()做了几个实验,它接受一个对象,然后给出相应的属性。请对 types 模块做相同的实验。记下您熟悉的类型,包括您对这些类型的认识,然后记下你还不熟悉的类型。在学习 Python 的过程中,你要逐步将“不熟悉”的类型变得“熟悉”起来
答:
4-8.列表和元组。列表和元组的相同点是什么?不同点是什么?
答:1)相同点:列表和元组的存储模型都是容器,访问模型都是顺序访问
2)不同点:两者的更新模型不同,列表的更新模型是可更改的,即可变的(mutable),而元组的更新模型是不可更改的,即不可变的(immutable)
4-9.练习,给定以下赋值:
a = 10
b = 10
c = 100
d = 100
e = 10.0
f = 10.0
请问下面各表达式的输出是什么?
(a) a is b
(b) c is d
(c) e is f
答: (a) True
(b) True
(v) False
为什么会这样:
整数对象和字符串对象是不可变对象,所以 Python 会很高效的缓存它们。这会造成我们认为 Python 应该创建新对象时,它却没有创建新对象的假象。
我们通过查看对象的身份来看看发生了什么
Python 仅缓存简单整数,因为它认为在 Python 应用程序中这些小整数会经常被用到。Python 2.3 中决定,在预定义缓存字符串表之外的字符串,如果不再有任何引用指向它,那这个字符串将不会被缓存。也就是说, 被缓存的字符串将不会象以前那样永生不灭,对象回收器一样可以回收不再被使用的字符串。