码迷,mamicode.com
首页 > 编程语言 > 详细

Python 拾遗

时间:2018-06-03 17:31:29      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:重点   迭代   直接   set   iter   pre   很多   特性   简单   

偶尔复习,查漏补缺。

不可变对象

不可变对象常用在 参数共享/参数传递 上,好处很多,一是可以使用字符串池来节省空间,二是该对象可以安全地共享/传递,不会造成误修改问题。

  1. numbers
  2. string
  3. tuple
  4. frozenset

a. 问题

在使用*作为重复运算符时,如果目标是一个嵌套的可变对象,就会产生令人费解的问题:

>>> a = [1,2,3]
>>> b = a * 3
>>> b
[1, 2, 3, 1, 2, 3, 1, 2, 3]
>>> b = [a] * 3  # nested
>>> b
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]
>>> b[1][1] = 4
>>> b
[[1, 4, 3], [1, 4, 3], [1, 4, 3]]

因为 * 并不是深拷贝,它只是简单地复制了 [a] 这个列表,里面的 [1,2,3] 都是同一个对象,所以改了一个,所有的都会改变。
解决方法是不要使用 * 号,改用a.copy() for i in range(3)] 执行深拷贝。如果不需要修改,请直接使用不可变对象。

b. 奇技淫巧

  1. 序列分组(使用了浅拷贝的特性)

    >>> a = ‘asdfghjkl‘
    >>> iters = [iter(a)] * 3  # 这里是浅拷贝,列表中的三个元素都是同一个迭代器。重点就是这个
    >>> parts = zip(*iters)  # 参数解包
    >>> list(parts)
    [(‘a‘, ‘s‘, ‘d‘), (‘f‘, ‘g‘, ‘h‘), (‘j‘, ‘k‘, ‘l‘)]

Python 拾遗

标签:重点   迭代   直接   set   iter   pre   很多   特性   简单   

原文地址:https://www.cnblogs.com/kirito-c/p/9129456.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!