• Python(2)—List、Set、Tuple、Dictionary之间的区别、参数传递


    1、list 列表

      有序集合,随时增删。包含的数据类型可以不同:整数、浮点数、字符串、list、tuple、dict、set、bool、空值、常量。

      list = [12, 'Yummy', 19.2, [1, 3, 'zhan']]

    • list名为列表,相当于一个数组

    • list列表是有序的,其中的每个元素都分配一个位置索引,索引值从0开始

    • list的长度是自动变化的

    • list列表元素不必都是同一种类型

    • list列表可以进行截取、组合、修改、增加等操作

    • list列表中的元素用中括号[]来表示

      函数:len()、append()、remove()移除列表中某个值的第一个匹配项、insert()、pop()、sort()、del、list()、reverse()、index()从列表中找出某个值第一个匹配项的索引位置、count()统计某个元素在列表中出现的次数、extend()在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)。

      删除:del list1[0]

      元祖转换为列表:tuple-->list  list(tuple)

      append(value)把元素添加到末尾、insert(i,value)把元素添加到任意位置;pop()删除末尾元素、pop(i)删除指定位置的元素、remove(value)直接删除某个元素值;list1.sort()对元素进行排序

      取值:list1[0]、list1[4:]、list1[:-4]、list1[2:-3],嵌套:list里面可以嵌套list从而形成类似于二维、三维、多维数组的。

    2、tuple 元组

      tuple = (3.14,'yu',[3,1,2])

       tuple[1] = 'a'

      python内置的数据类型,有序列表,一旦初始化,无法修改。tuple不可变,所以代码更安全。可以看做是一种“不变”的List,即tuple一旦创建完毕,就不能修改了。

      Tuple元组中的元素用小括号()来表示。

    3、dict 词典  

      d={'Michael': 95, 'Bob': 75, 'Tracy': 85}

      键值对(key-value)方式存储,查找速度快;dict的key必须是不可变对象(字符串、数字、元祖);相当于一个HashMap。

    • Dictionary字典查找速度快,但是代价是耗费的内存大。List相反,占用内存小,但是查找速度慢。这就好比是数组和链表的区别

    • Dictionary字典没有顺序,而List是有序的集合,所以不能用Dict来存储有序集合

    • Dictionary字典的Key不可变,Value可变。一旦一个键值对加入dict后,它对应的key就不能再变了,但是Value是可以变化的

    • Dictionary字典中的Key不可重复

    • Dictionary字典中的元素用中花括号{}来表示

    4、set 无序集合、key不重复

      set = set(['A','B','C','B','C'])

      要创建一个set,需要提供一个list作为输入集合。

      无索引、无切片、作为一个无序的集合,set不记录元素位置或者插入点。因此,set不支持 indexing, slicing, 或其它类序列(sequence-like)的操作

      set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。

    • set就像是把Dict中的key抽出来了一样,类似于一个List,但是内容又不能重复

    • set集合是无序的

    • set集合通过调用set()方法创建

    5、总结:

    •      1、list、tuple是有序列表;dict、set是无序列表
    •      2、list元素可变、tuple元素不可变
    •      3、dict和set的key值不可变,唯一性
    •      4、set只有key没有value
    •      5、set的用途:去重、并集、交集等
    •      6、list、tuple:+、*、索引、切片、检查成员等
    •      7、dict查询效率高,但是消耗内存多;list、tuple查询效率低、但是消耗内存少

    6、Python 的参数传递

    1. 对于不可变对象作为函数参数,相当于C系语言的值传递; 
    2. 对于可变对象作为函数参数,相当于C系语言的引用传递。 

      tuple,number等为不可变对象,list等对象是可变对象。但是这样理解从结果上理解是正确的,从原理上说,前面已经说过了,python一切对象传递的都是地址,不同的是,在函数内部转换的过程不一样。 

    代码解释: 
      在程序内部,test_list的地址和test_number的地址都传递都函数test中去。 
      执行.pop()操作的时候,是在原地址上进行操作,因此会改变原来的值。 
      执行+1操作的时候,test_number + 1 = 2,开辟了一段内部地址指向了2,局部地址(局部对象)指向了这个新对象2,原来的test_number并没有改变,因此原来的test_number并不会改变。 
      同理:如果将test_list.pop()改成 test_list = [1],那么原来的test_list的地址也不会改变,即print test_lists仍然会打印出 [1,2,3]。

    def test(test_list, test_number):
        test_list.pop()
        test_number = test_number + 1
    
    # 参数分别为list类型和number类型, 也就是一个是可变对象,一个是不可变对象
    test_list = [1, 2, 3]
    test_number = 1
    
    test(test_list, test_number)
    
    print test_list  # 输出[1, 2]
    print test_number  # 输出[1]

    举例说明:

    show me the code

    def bad_append(new_item, a_list=[]):
        a_list.append(new_item)
        return a_list
    

      这段代码是初学者最容易犯的错误,用可变(mutable)对象作为参数的默认值。函数定义好之后,默认参数 a_list 就会指向(绑定)到一个空列表对象,每次调用函数时,都是对同一个对象进行 append 操作。因此这样写就会有潜在的bug,同样的调用方式返回了不一样的结果。

    >>> print bad_append('one')
    ['one']
    >>> print bad_append('one')
    ['one', 'one']

      而正确的方式是,把参数默认值指定为None,指定一个新的地址,保存变量

    def good_append(new_item, a_list=None):
        if a_list is None:
            a_list = []
        a_list.append(new_item)
        return a_list
  • 相关阅读:
    选项卡自动切换(定时器demo)
    JS基础——选项卡套选项卡(函数传参)
    JS基础——修改文本框的值(函数传参)
    JS基础——选项卡列表显示隐藏缩略图(函数传参)
    js基础——图片切换实例(函数传参)
    JS 获取元素的属性值,非内联样式
    css position 定位
    ie6-7 overflow:hidden失效问题的解决方法
    Vue自带的过滤器
    Vue数据绑定
  • 原文地址:https://www.cnblogs.com/eilearn/p/9538513.html
Copyright © 2020-2023  润新知