编程语言间总有许多共通的地方,最近新接触Python,也多亏了有C/C++的基础,入门似乎不会太难。但毕竟语言有自己的特色,今天先记录下Python list的学习笔记(主要是python与C/C++的对比)。
- 支持不同类型的列表项
Python List是一种复合数据类型,用于组织其他的值,特别的是它的列表项不需要具有相同的类型,比如:
>>> a= ['spam','eggs',100,1234]
- 分片 (Slices)
>>> a[1:-1]
['eggs', 100]
>>> # Replace some items:
... a[0:2]= [1,12]
>>> a
[1, 12, 123, 1234]
>>> # Insert some:
... a[1:1]= ['bletch','xyzzy']
>>> a
[123, 'bletch', 'xyzzy', 1234]
>>> # Clear the list: replace all items with an empty list
>>> a[:]= []
>>> a
[]
- 列表复制
>>> a = [1, 2, 3]
>>> b = a
我们可以使用id()函数来检查这一点:
>>> a[:]= []id(a)
35800712L
>>> id(b)
35800712L
要进行正确的列表复制,有下面几种解决方法:
利用分片操作:
new_list = old_list[:]
这感觉很像Perl吧,不过对于新手或非python程序员来说可读性不太高。
调用构造函数:
new_list = list(old_list)
根据传入的序列构造一个新的列表,这个序列不一定也是列表,还可以是元组什么的。
引入copy模块:
import copy
new_list = copy.copy(old_list)
copy.copy()的效率比list()稍稍低一些,因为它需要对数据类型进行判断,这也说明它是一个普遍适用的方法。注意它可以复制对象,但对于对象中的元素,依然使用引用。
以上方法都可以得到一个浅复制。这些方法只适用于简单列表,也就是列表中的元素都是基本类型的时候,因为[: ]只是将列表元素的值生成一个新的列表。如果列表元素是复杂类型(或对象)的时候,就只能得到该元素的引用。如果我们想修改对象中的元素,而不仅仅是得到对象本身的话,就需要到深复制:
import copy
new_list = copy.deepcopy(old_list)
显然copy.deepcopy()会耗费一些时间和空间,但有时这是不可避免的。
PS:
在Python中,对象的复制、参数传递或返回值,都是引用传递的。如果需要一个的拷贝,必须显式地要求。
is操作符用于判断两个对象是否完全一致,是否是同一对象(is判断的是标识符,比较内容还是用==),这对于可修改的对象是很重要的。
>>> s = 'cat'
>>> t = copy.copy(s)
>>> s is t
True