zoukankan      html  css  js  c++  java
  • python可变与不可变数据类型+深浅拷贝

    转自:https://www.cnblogs.com/miaomiaokaixin/p/11497813.html

    一:学习内容

    • python3中六种数据类型
    • python赋值
    • python浅拷贝
    • python深拷贝

    二:python3六种数据类型

    1.六种数据类型

    • Number(数字)
    • string(字符串)
    • List(列表)
    • Tuple(元祖)
    • Set(集合)
    • Dictionary(字典)

    2.六种数据类型分类

    • 不可变数据(3个):Number、String、Tuple
    • 可变数据(3个):List、Dictionary、Set

    3.六种类型总结

    • Number(数字):支持 int(整形)、float(浮点型)、bool(布尔型)、complex(复数).  只有一个整数类型int,表示为长整型;没有python2中的long。
    • String(字符串):字符串使用双引号或是单引号括起来,同时使用反斜杠转义特殊字符;索引以0为开始值,-1为从末尾的开始位置。
    • List(列表):列表写在 [] 之间,元素之间用逗号隔开;索引以0为开始值,-1为从末尾的开始位置;列表元素类型可以不同,由数字、字符串、列表(所谓的嵌套)组成;有序的对象集合。
    • Tuple(元组):元组写在()之间,元素之间用逗号隔开;元组元素类型可以不同,由数字、字符串、元组等组成;元组的元素不可变,但是可以包含可变的对象,比如list列表;有序的对象集合;构造一个元素的元组,需要在元素后面加上逗号。
    • Dictionary(字典):字典写在{}之间,由键(key):值(value)对集合组成,元素之间用逗号隔开;字典中的元素通过键来存取,而不是通过偏移存取;键key必须使用不可变类型,同一个字典中,键必须是唯一的;创建空字典使用 {}。
    • Set(集合):集合写在{}之间,基本功能是进行成员关系测试和删除重复元素;可使用大括号 {}或者set()函数创建集合;创建一个空集合必须是set(),{}代表的是空字典。

    三:python赋值

    1.赋值(=):数据完全共享

    赋值是在内存中指向同一个对象:

    如果是可变(mutable)类型,比如列表、字典、集合,修改其中一个,另一个必定改变

    如果是不可变类型(immutable),比如数字、字符串、元组,修改了其中一个,另一个并不会变

    2.举例说明--可变类型赋值:列表、字典、集合

    ====s1是可变类型列表,s1赋值给s2,然后修改s1,s2就会跟着改变

    s1 = [1,2,3]
    s2 = s1
    s1.append(4)
    s1
    s2

    ====s3是可变类型字典,s3赋值给s4,然后修改s3,s4就会跟着改变

    s3= {"name":"tester"}
    s4 = s3
    s3["age"] = 18
    s3
    s4

    ====s5是可变类型集合,s5赋值给s6,然后修改s5,s6就会跟着改变

    s5= set([1,2,3,4])
    s6 = s5
    s5.add(5)
    s5
    s6

     

    3.举例说明--不可变类型赋值:数字、字符串、元组

    ====s1是不可变类型数字,s1赋值给s2,然后修改s1,s2不会跟着改变

    s1 = 10
    s2 = s1
    s1=12
    s1
    s2

    ====s3是不可变类型字符串,s3赋值给s4,然后修改s3,s4不会跟着改变

    s3 = "testing"
    s4 = s3
    s3=  "tesing testing"
    s3
    s4

    ====s5是不可变类型元组,s5赋值给s6,然后修改s5,s6不会跟着改变

    s5 = (1,2,3)
    s6 = s5
    s5=  (1,2,3,4)
    s5
    s6

    四:python浅拷贝

    1.浅拷贝:数据半共享(拷贝第一层的数据,具有自己单独的内存地址;嵌套层即第二层或其他层不拷贝,指向原有的内存地址)

    2.原则

    只复制一层,他变我不变;其余层,他变我也变。
    如果只有一层,就相当于深拷贝了

    3.方法-三种

    第一种:a = b[:]
    第二种:a = b.copy()
    第三种:引用copy模块,import copy  |  a = copy.copy(b)

    4.举例--浅拷贝

    s1 = [1,2,3,[4,5,6]]
    #浅拷贝
    s2 = s1[:]

    #s1第一层改变,s2不会跟着改变
    s1[2] = 55
    s1
    s2

    #s1第二层即嵌套层改变,s2也跟着改变
    s1[3][0] = 66
    s1
    s2

    图解上述过程:

    s2在内存中已经独立出s1第一层的数据,第二层的数据并没有拷贝成功,而是指向了s1中的第二层数据的内存地址

    所以就会有:

    s1中第一层数据发生变化,s2中第一层数据不跟着改变

    s1中第二层数据发生变化,s2中第二层数据也发生变化

    五:python深拷贝

    1.深拷贝:数据完全不共享(复制其数据完完全全放独立的一个内存,完全拷贝,数据不共享)

    2.原则

    他变我也变。

    3.方法

    引用copy模块,import copy  |  a = copy.deepcopy(b)

    4.举例--深拷贝

    import copy

    s1 = [1,2,3,[4,5,6]]
    #深拷贝
    s2 = copy.deepcopy(s1)

    #s1第一层改变,s2不会跟着改变
    s1[2] = 55
    s1
    s2

    #s1第二层即嵌套层改变,s2也不会跟着改变
    s1[3][0] = 66
    s1
    s2

    图解上述过程:

    s2在内存中已经独立出s1的数据

    所以就会有:

    s1中第一层数据发生变化,s2中第一层数据不跟着改变

    s1中第二层数据发生变化,s2中第一层数据也不跟着改变

  • 相关阅读:
    Luogu P4727 [HNOI2009]图的同构记数
    ARC 101 E
    JSOI2019 Round2 游记
    JSOI2019 Round1(十二省联考)游记
    Technocup 2019
    Codeforces Round #533 (Div. 2)比赛总结
    学习链接
    2018.12.29-2018.1.9安师大附中集训
    关于考试
    NOIP2018提高组 游记
  • 原文地址:https://www.cnblogs.com/lishuaijiang/p/12887509.html
Copyright © 2011-2022 走看看