Python05——字典、集合以及序列

字典

心得

在资料《Python编程入门》1中说,判断一个数据类型是否可变,可采用两种方法:

  1. 麻烦方法:用 id(X) 函数,对 X 进行某种操作,比较操作前后的 id ,如果不一样,则 X 不可变,如果一
    样,则 X 可变。
  2. 便捷方法:用 hash(X) ,只要不报错,证明 X 可被哈希,即不可变,反过来不可被哈希,即可变。

方法1.当下并没有理解,查阅Python的官方帮助文档,有以下解释:

  • id(object)

Return the “identity” of an object. This is an integer which is guaranteed to be unique and constant for this object during its lifetime. Two objects with non-overlapping lifetimes may have the same id() value.

CPython implementation detail: This is the address of the object in memory.

翻译过来如下:

  • id(object)

返回对象的唯一标志。这是一个可以保证该对象在其生命期间的唯一性和永恒性。具有非重叠生存期的两个对象可能具有相同的id()值。

CPython的细节:这是对象的内存地址。

个人理解:其实id()函数返回对象的内存地址,Python可以通过内存地址进行数据类型的判断。

紧接着资料给出如下例子:

i = 1
print(id(i)) # 140732167000896
i = i + 2
print(id(i)) # 140732167000960
l = [1, 2]
print(id(l)) # 4300825160
l.append('Python')
print(id(l)) # 4300825160

在这两个例子中,第一行对对象i进行赋值,表面赋予其整型类型。但是在Python的运行环境中是开辟了一个值为1的整型类型,第三行进行增加运算,虽然i的值发生了改变,但是Python在内部却将原先值为1的整型变量进行释放(前提是,在其他地方并没有用到值为1的整型变量,关于这点建议阅读**《Python源码分析》**2),同时新建了一个值为3的整型变量。所以两处的i会有不同的id。

针对于列表类型,在第五行,新建的[1,2]列表也只是将其地址存放在了变量l里面,当对列表进行末尾追加时,仅仅将其指向下一个指针进行了赋值,而头节点并没有发生改变,所以两处的l会有相同的id。

当然,通过以下例子,可以进一步帮助理解:

a = b = 1
print(a)	 #  1
print(b)	 #  1
print(id(a)) #  1523344528
print(id(b)) #  1523344528
a = 2
print(a)	 #  2
print(b)	 #  1
print(id(a)) #  1523344544
print(id(b)) #  1523344528
l = m = [1, 2]
print(l)	 #  [1, 2]
print(m)	 #  [1, 2]
print(id(l)) #  59883608
print(id(m)) #  59883608
l.append('Python')
print(l)	 #  [1, 2, 'Python']
print(m)	 #  [1, 2, 'Python']
print(id(l)) #  59883608
print(id(m)) #  59883608

通过这个例子,可能会比较容易理解可变类型和不可变类型在引用过程中的差别。这一特性可以联想、参考到C#中的值类型引用类型3

资料中最后说明:

  1. 数值、字符和元组 都能被哈希,因此它们是不可变类型。

  2. 列表、集合、字典不能被哈希,因此它是可变类型。

个人对此处的理解如下:

  1. 数值、字符和元组 都能被哈希,因此它们是不可变类型,属于值类型
  2. 列表、集合、字典不能被哈希,因此它是可变类型,属于引用类型

习题

集合

心得

  • 集合中没有重复元素,使用该属性可以实现元素的唯一性操作。
  • 集合是无序的,因此不存在索引和切片操作,以及不可以使用键进行查询。
  • 通过add方法可以为集合增加不重复的元素。
  • 关于集合,有一类比较有意思的操作:交集(&)、并集(|)、差集(-)、异或(^)、是否包含(<=或者>=)、是否相交。
  • 集合、元组、列表之间可以进行转换。

习题

序列

心得

序列类似于C#中的序列化操作。关于序列化操作,C#中有相应的类型,比如XML序列化、JASON序列化。阅读手册后发现个有趣的方法:zip。这个第一眼看上去就联想到了zip格式的压缩文件。官方给出的解释如下:

Make an iterator that aggregates elements from each of the iterables.

Returns an iterator of tuples, where the i-th tuple contains the i-th element from each of the argument sequences or iterables. The iterator stops when the shortest input iterable is exhausted. With a single iterable argument, it returns an iterator of 1-tuples. With no arguments, it returns an empty iterator.

其实也是压缩的一种解释,这里是对内存进行了压缩。

习题


  1. 《Python 编程入门》. DataWhale等. 2007 ↩︎

  2. 《Python 源码剖析》. 陈儒. 电子工业出版社. 2008-6. ↩︎

  3. 《C#高级编程(第10版)》. Christian Nagel. 清华大学出版社. 2017年3月第一版. P90. ↩︎

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页