字典是通过这样的算法来比较的: 首先是字典的大小,然后是键,最
后是值。可是,用 cmp() 做字典的比较一般不是很有用
1)比较字典长度
如果字典的长度不同,
那么用 cmp(dict1, dict2) 比较大小时,
如果字典 dict1 比 dict2 长,
cmp()返回正值,如果 dict2 比 dict1 长,则返回负值。也就是说,字典中的键的个数越多,这个
字典就越大,即:
len(dict1) > len(dict2) ==> dict1 > dict2
(2)比较字典的键
如果两个字典的长度相同,那就按字典的键比较;键比较的顺序和 keys()方法返回键的顺序相
同。 (注意: 相同的键会映射到哈希表的同一位置,这保证了对字典键的检查的一致性。) 这时,
如果两个字典的键不匹配时,对这两个(不匹配的键)直接进行比较。当 dict1 中第一个不同的键大
于 dict2 中第一个不同的键,cmp()会返回正值。
(3)比较字典的值
如果两个字典的长度相同而且它们的键也完全匹配,则用字典中每个相同的键所对应的值进行
比较。一旦出现不匹配的值,就对这两个值进行直接比较。若 dict1 比 dict2 中相同的键所对应的
值大,cmp()会返回正值。
(4) Exact Match
到此为止,即,每个字典有相同的长度、相同的键、每个键也对应相同的值,则字典完全匹配,
返回 0 值。
对象同一性,在 Python 中写为 str1 is str2
比较两个字符串值,在 Python 中,你要使用 str1 == str2。
在 Python 中,只有类属性可以定义在这里(紧跟在类定义之后定义),数据属性定义在 __init__ 方法中。
每个 Python 类都拥有一个内置的类属性 __module__,它定义了这个类的模
块的名字
sys.modules[FileInfo.__module__]) 可以得到对应模块的引用,
FileInfo.__module__ 可以得到FileInfo类属于的模块名字(string)
getattr,它可以通过名字得到一个对象的引用
再次强调[:]得到的是包含了X所有元素的分片,这是一种很有效率的复制整个列表的方法。
只是简单的把X复制给Y是没有用的,因为这样做就让X和Y都指向同一个列表了
先复制,后排序
y=x[:]
y.sort()
字符串 都是不可变的 在序列中不可改变
在类中,self.__class__表示引用实际的类,self.__class__.name 表示实例化对象的类的名字
核心笔记:__name__ 指示模块应如何被加载
由于主程序代码无论模块是被导入还是被直接执行都会运行, 我们必须知道模块如何决定
运行方向。一个应用程序可能需要导入另一个应用程序的一个模块,以便重用一些有用的代码
(否则就只能用拷贝粘贴那种非面向对象的愚蠢手段)。这种情况下,你只想访问那些位于其
它应用程序中的代码,而不是想运行那个应用程序。因此一个问题出现了,“Python 是否有
一种方法能在运行时检测该模块是被导入还是被直接执行呢?” 答案就是......(鼓声雷
动).....没错! __name__ 系统变量就是正确答案。
如果模块是被导入, __name__ 的值为模块名字
如果模块是被直接执行, __name__ 的值为 ‘__main__‘
对象的引用计数在下列情况增加:
1:对象被创建
x = 3.14
2:或另外的别名被创建
y = x
3: 或被作为参数传递给函数(新的本地引用)
一个对象的引用计数在以下情况会减少:
1: 一个本地引用离开了其作用范围。比如 foobar()(参见上一下例子)函数结束时。
2: 对象的别名被显式的销毁。
del y # or del x
3: 对象的一个别名被赋值给其它的对象
x = 123
4: 对象被从一个窗口对象中移除
myList.remove(x)
5: 窗口对象本身被销毁
del myList # or goes out-of-scope
del 语句
Del 语句会删除对象的一个引用,它的语法是:
del obj1[, obj2[,... objN]]
例如,在上例中执行 del y 会产生两个结果:
? 从现在的名字空间中删除 y
? x 的引用计数减一
foo1 = foo2 = 4.3
当你从值的观点看这条语句时, 它表现的只是一个多重赋值,将 4.3 这个值赋给了 foo1
和 foo2 这两个变量。这当然是对的, 不过它还有另一层含义。 事实是一个值为 4.3 的数字对
象被创建,然后这个对象的引用被赋值给 foo1 和 foo2, 结果就是 foo1 和 foo2 指向同一个对
象
在 Python 中, 变量更像一个指针指向装变量值的盒子。 对不可改变类型来说, 你无法
改变盒子的内容, 但你可以将指针指向一个新盒子。每次将另外的数字赋给变量的时候,实际
上创建了一个新的对象并把它赋给变量.(不仅仅是数字,对于所有的不可变类型,都是这么回
事)
Tab自动补全
>>> import rlcompleter,readline
>>>readline.parse_and_bind(‘tab: complete‘)