• python入门day03——变量、内存管理:垃圾回收机制(GC)、常量


    一、什么是变量

            :记录下事物的状态
            :事物的状态是可以被改变的
            变量就是可以变化的量,量指的是事物的状态,比如人的年龄、性别,游戏角色的等级、金钱等等

    二、为何要用变量

            为了让计算机能够像人一样记忆事物的状态
            并且状态是可以变化的

            变量存的状态是存放于计算机的内存中的

            详细地说:
            程序执行的本质就是一系列状态的变化,变是程序执行的直接体现,所以我们需要有一种机制能够反映或者说是保存下来

    二、如何用变量

            原则:先定义、后引用

    1、 定义

            变量名(相当于门牌号,指向值所在的空间),等号,变量值

    name = 'sa'
    age = 18
    salary = 3.1
    

    1.1 变量定义的三个组成部分

           变量名:关联一个房间的地址,用来找到变量值
           赋值符号:把房间的地址(内存地址)绑定给变量名
           变量值:就是我们记忆的状态或数据

    1.2 变量名的命名规范

           大前提: 变量名的命名应该在保证见名知意的前提下,尽可能的简短
           (1): 由字母、数字、下划线组成
           (2): 不能以数字开头
           (3): 不能使用python的关键字命名变量名:['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del','elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global','if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise','return', 'try', 'while', 'with', 'yield']

    1.3 变量名的命名风格

           (1)纯小写+下划线(变量推荐用这个)
                  age_of_liuxing = 99
           (2)驼峰体
                  AgeOfLiuxing = 99

    2、 引用变量值

           print(name)

    # xxx # 没有语法错误,有逻辑错误
    

           变量名在等号左边,代表的是赋值操作
           变量名只要不在等号左边,代表的是取值操作

    age = 18  # age进行赋值
    print(age + 1) 
    res=age+1 # age进行取值
    print(res )
    

    2.1 变量值的三大特征id,type,value

           value:值
           type:类型

    x = 10
    print(type(x))
    name = 'sa'
    print(type(name))
    # 结果
    # <class 'int'>
    # <class 'str'>
    
    x=1111
    y=222
    z=333
    print(type(x) == int)
    print(type(y) == int)
    print(type(z) == int)
    # 因为更符合人类语言 能让人们容易看懂 用is更好更规范
    print(type(x) is int)
    print(type(y) is int)
    print(type(z) is int)
    # 结果均为True
    

           id反映的是内存地址

    x = 10  # x存的是10的内存地址
    y = x  # y存的也是10的内存地址
    

           一个内存地址可以被多个变量名使用
           id一样 内存地址就一样 内存地址一样 值就一样

    x = 10
    y = x
    id(x)
    id(y)
    print(id(x))
    print(id(y))
    # 结果
    # 4540992432
    # 4540992432
    

           is判断的是id是否相等

    x = 111
    y = 222
    print(x is y)
    # 结果
    # False
    
    x = 111
    y = x
    print(x is y)
    # 结果
    # True
    

           == 判断的是值value是否相等

    name1 = 'aaa,bbb,123'
    name2 = 'aaa,bbb,123'
    print(name1 == name2)
    # 结果
    # True
    
    # 因为python3的优化 导致id相等
    # python2中内容
    >>> x='aaa,bbb,123'
    >>> y='aaa,bbb,123'
    >>> x is y
    False
    >>> id(x),id(y)
    (4332270000, 4332270240)
    >>> x==y
    True
    >>>
    

           强调1:id如果相等(is判断true),值一定相等
           强调2:id如果不相等(is判断false),值不一定相等(值可以相等)

    2.2 了解小整数池(-5~256)

           在python中万物即对象,所以is比较的是id值相同不相同,而==仅比较值。
           对于值大小在-5~256之间的变量,python因为有内存池缓存机制,会对该值分配内存,而不是变量,所以
           只要是该值的变量都指向同一个内存,即id相同。

           在交互式模式下
           Python实现int的时候有个小整数池。为了避免因创建相同的值而重复申请内存空间所带来的效率问题,Python解释器会在启动时创建出小整数池,范围是[-5,256],该范围内的小整数对象是全局解释器范围内被重复使用,永远不会被GC回收

    每创建一个-5到256之间的整数,都是直接从这个池里直接拿走一个值,例如

    >>> y=4
    >>> id(y)
    4297641184
    >>>
    >>> x=3
    >>> x+=1
    >>> id(x)
    4297641184
    

           在pycharm中运行python程序,pycharm出于对性能的考虑,会扩大小整数池的范围,其他的字符串等不可变类型也都包含在内一便采用相同的方式处理了,我们只需要记住这是一种优化机制,至于范围到底多大,无需细究

    三、内存管理:垃圾回收机制(GC)

    1、什么是垃圾回收机制

           垃圾回收机制(简称GC)是Python解释器自带一种机,专门用来回收不可用的变量值所占用的内存空间

    2、为什么要用垃圾回收机制

           程序运行过程中会申请大量的内存空间,而对于一些无用的内存空间如果不及时清理的话会导致内存使用殆尽(内存溢出),导致程序崩溃,因此管理内存是一件重要且繁杂的事情,而python解释器自带的垃圾回收机制把程序员从繁杂的内存管理中解放出来。

    3、垃圾回收机制原理分析

           Python的GC模块主要运用了“引用计数”(reference counting)来跟踪和回收垃圾。在引用计数的基础上,还可以通过“标记-清除”(mark and sweep)解决容器对象可能产生的循环引用的问题,并且通过“分代回收”(generation collection)以空间换取时间的方式来进一步提高垃圾回收的效率。
           引用计数
           引用计数就是:变量值被变量名关联的次数

    x = 10  # 值10的引用计数为1
    y = x  # 引用计数增加 值10的引用计数为2
    # x的内存地址给了y,此时,x,y都关联了10,所以变量值10的引用计数为2
    
    y = 123  # 引用计数减少 值10的引用计数减少为1
    # y与值10解除关联,再与123建立了关联,变量值10的引用计数为1
    del x #值10的引用计数减少为0
    # del的意思是解除变量名x与变量值10的关联关系,此时,变量10的引用计数为0
    # 值18的引用计数一旦变为0,其占用的内存地址就应该被解释器的垃圾回收机制回收
    

           上述打个比方 之前讲过小整数池中的对象是全局解释器范围内被重复使用,永远不会被GC回收

    四、常量

           常量:不可以被改变的量

    # GO语言
    const age int = 18
    age = 19  # 报错
    
    # python语言:变量名全为大写代表常量
    AGE = 18
    

           python中没有那么多的限制,它认为程序员都会自己自觉遵守规矩,python的规矩则是将变量名全为大写代表常量

  • 相关阅读:
    kubernetes集群系列资料08--deployment介绍
    kubernetes集群系列资料07--RS介绍
    kubernetes集群系列资料06--pod介绍
    kubernetes集群系列资料05--K8S集群命令介绍
    kubernetes集群系列资料04--harbor部署
    uwsgi + nginx 部署python项目(一)
    argparse命令行传参
    Flask的 sqlalchemy 操作要点
    mysql: show full processlist 详解
    MySQL数据库的连接池问题
  • 原文地址:https://www.cnblogs.com/liuxinging/p/13261652.html
Copyright © 2020-2023  润新知