zoukankan      html  css  js  c++  java
  • python 列表 -- 容易犯的错误

    1。列表的赋值和切片:

      切片返回的是列表对象的浅复制, 与列表对象的直接赋值并不一样:

    >>> a = [1,2,3]
    >>> b=a
    >>> b
    [1, 2, 3]
    >>> a.append(4)
    >>> b
    [1, 2, 3, 4]
    >>> 
    >>> a=[1,2,3]
    >>> b=a[::]
    >>> b
    [1, 2, 3]
    >>> a.append(4)
    >>> a
    [1, 2, 3, 4]
    >>> b
    [1, 2, 3]
    >>> 

    2。列表的删除和插入

      remove 和insert是对列表任意位置的元素进行删除和添加,但是会有意想不到的结果

    原因在于列表的自动内存管理功能,当列表中的元素插入和删除时,列表会自动进行重新建立索引,保证元素的间没有空隙

    >>> x = [1,2,2,3,3,4,5,6,1,1,2,3]
    >>> for i in x:
        i
        if i ==1:
            x.remove(i)
            x
    
            
    1
    [2, 2, 3, 3, 4, 5, 6, 1, 1, 2, 3]
    2
    3
    3
    4
    5
    6
    1
    [2, 2, 3, 3, 4, 5, 6, 1, 2, 3]
    2
    3
    >>> 

    最后的结果是没有把列表中的1元素删除

    insert也是同样的结果

    (遍历的时候,是按照索引遍历,索引由于删除和插入被自动改变,所以遍历也很会相应的发生改变)

    如何解决这个问题!

    可以使用从后往前的方式删除列表中的元素,应为插入和删除并不会影响最后一个元素的索引的

    >>> x
    [1, 2, 2, 3, 3, 4, 5, 6, 1, 1, 2, 3]
    >>> for i in range(len(x)-1,-1,-1):
        i
        if x[i] ==1:
            del x[i]
            x
    
            
    11
    10
    9
    [1, 2, 2, 3, 3, 4, 5, 6, 1, 2, 3]
    8
    [1, 2, 2, 3, 3, 4, 5, 6, 2, 3]
    7
    6
    5
    4
    3
    2
    1
    0
    [2, 2, 3, 3, 4, 5, 6, 2, 3]
    >>> 
  • 相关阅读:
    Codeforces Round #702 (Div. 3) 题解
    Educational Codeforces Round 104 (Rated for Div. 2) A~E题解
    AtCoder Regular Contest 112 A~D题解
    Codeforces Round #701 (Div. 2) A~E 题解
    java String, StringBuffer, StringBuilder简单介绍和使用
    货仓选址
    线程的同步
    数据结构课设作业
    线程的生命周期(java 图)
    JAVA多线程的创建和使用
  • 原文地址:https://www.cnblogs.com/vincent-sh/p/13051466.html
Copyright © 2011-2022 走看看