• python中的列表


    在python中,列表是可变数据类型

    以下面案例作为说明:

    >>> li = [1, 2, 3]
    >>> id(li)
    1922056253512
    >>> li.append(4)
    >>> li
    [1, 2, 3, 4]
    >>> id(li)
    1922056253512

    可见对列表取值做了修改之后,列表的内存地址并没发生改变,说明列表是可变数据类型。

    列表有许多操作,下面通过案例一一介绍:

    1.列表支持索引:

    >>> li = [1, 2, 3]
    >>> li[1]
    2
    >>> li[1:]
    [2, 3]
    >>> li[:2]
    [1, 2]
    >>> li[:]
    [1, 2, 3]
    >>> li.index(3)
    2

    2.列表的增删改查

    >>> li = [1, 2, 3]
    >>> li.append(4)
    >>> li
    [1, 2, 3, 4]
    >>> li.extend((5, 6))       #批量增加,必须是可迭代对象
    >>> li
    [1, 2, 3, 4, 5, 6]
    >>> li.insert(3, 7)         #指定位置插入元素
    >>> li
    [1, 2, 3, 7, 4, 5, 6]
    >>> li.pop()
    6
    >>> li
    [1, 2, 3, 7, 4, 5]
    >>> li.remove(4)
    >>> li
    [1, 2, 3, 7, 5]
    >>> li[1] = 9
    >>> li
    [1, 9, 3, 7, 5]
    >>> li[3]
    7
    >>> li
    [1, 9, 3, 7, 5]
    >>> li.clear() #清空列表元素
    >>> li
    []

    3.统计元素出现次数:

    >>> li = [3, 5, 2, 1, 2, 7]
    >>> li.count(2)
    2

    4.顺序排序和逆序排序

    >>> li = [3, 5, 2, 1, 2, 7]
    >>> li.sort()
    >>> li
    [1, 2, 2, 3, 5, 7]
    >>> li = [3, 5, 2, 1, 2, 7]
    >>> li.reverse()
    >>> li
    [7, 2, 1, 2, 5, 3]

    5.列表的复制

    要想实现列表复制效果有三种方式:赋值、浅copy、深copy。

    三种方式之不同:

    5.1赋值后的列表共享原列表的内存地址,意味着原列表发生改变时,被复制的新列表也发生改变,如下:

    >>> li1 = [1, 2, [4, 3]]
    >>> li2 = li1
    >>> li1
    [1, 2, [4, 3]]
    >>> li2
    [1, 2, [4, 3]]
    >>> id(li1)
    1922056248520
    >>> id(li2)
    1922056248520
    >>> li1[1] = 4
    >>> li1
    [1, 4, [4, 3]]
    >>> li2
    [1, 4, [4, 3]]

    5.2浅copy:经过浅copy后新列表和原列表有不同的内存地址,但是而这并不是独立的,先看如下代码:

    >>> li1 = [1, 2, [4, 3]]
    >>> li2 = li1.copy()
    >>> li1
    [1, 2, [4, 3]]
    >>> li2
    [1, 2, [4, 3]]
    >>> id(li1)
    1922056248328
    >>> id(li2)
    1922055173256
    >>> li1[1] = 4
    >>> li1
    [1, 4, [2, 3]]
    >>> li2
    [1, 2, [2, 3]]

    发现改变原列表的嵌套列表时,新列表也发生了变化,为何?

    浅copy复制的只是父级列表下的直接元素的内存地址,当这个内存地址对应的变量类型作为可变数据发生改变,那么新的列表也会发生改变,原因是这个可变数据发生改变时,它的内存地址不会发生变化。

    而当这个内存地址对应的变量类型作为不可变数据发生改变,那么他的内存地址就变了,而新的列表复制的是它原来的内存地址,是不会变化的。

    >>> li1 = [1, 2, [4, 3]]
    >>> li2 = li1.copy()
    >>> li1[2][0] = 2
    >>> li1
    [1, 2, [2, 3]]
    >>> li2
    [1, 2, [2, 3]]
    >>> id(li1[2])
    1922056248648
    >>> id(li2[2])     #改变作为可变类型的嵌套列表的数值,其内存地址不会变化
    1922056248648
    >>> li1[1] = 4
    >>> li1
    [1, 4, [2, 3]]
    >>> li2
    [1, 2, [2, 3]]
    >>> id(li1[1])
    1587703360
    >>> id(li2[1])     #改变作为不可变类型的数字的取值,其内存地址发生了变化,而新列表还是原来内存地址因此不会变化
    1587703296
  • 相关阅读:
    配置利用Tilcon 5.8 Radar Demo for vxWorks 6.8
    安装源REMI做源 CentOS上 PHP 的安装和升级
    产品苹果乔布斯和盖茨眼中真实的对方
    平台微软将死的平台:.Net
    企业生活12大颠覆性技术:移动互联网居首
    设备代工富士康加入Firefox OS阵营,下周将发布搭载Firefox OS的设备
    线程对象Android 开发之多线程处理、Handler 详解
    输出hadoop[置顶] hadoop之测试KMeans(二):输出结果分析
    个位数字poj 3126 Prime Path
    nullnullGet previous business day
  • 原文地址:https://www.cnblogs.com/tarantino/p/10219439.html
Copyright © 2020-2023  润新知