[Python] List & 深浅复制

    编程语言间总有许多共通的地方,最近新接触Python,也多亏了有C/C++的基础,入门似乎不会太难。但毕竟语言有自己的特色,今天先记录下Python list的学习笔记(主要是python与C/C++的对比)。

  • 支持不同类型的列表项

      Python List是一种复合数据类型,用于组织其他的值,特别的是它的列表项不需要具有相同的类型,比如:

        >>> a= ['spam','eggs',100,1234]

  • 分片 (Slices)
      list[i: j]返回一个序列的切片,这个新的列表中new_list[k], i <= k < j,比如:
        >>> 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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值