• 代码块与缓存机制


    ## `id` `is` 与 `==`
    1.需要区分`is`与`==`的区别,需要借助`id`来实现。
    计算机在存储数据的时候,都会在内存里开辟一个空间。可以想象为酒店的房间号,
    是该数据第一无二的标识,这个标识就是`id`。比如创建一个变量`A = 123`,可
    以通过`id(A)`来查变量A的内存地址,通过查找它的`id`是`140711580377728`。
    这里注意,没运行一次代码,内存都会随机变化,但在单独的一次中它的`id`是唯一
    的。就相当于你每次办理酒店入住,房间号都是随机选的,但哪个房间号该酒店是唯一
    的。
    2.`is`与`id`
    python中使用逻辑比较符is来判断两元素是否源于同一引用,即是否地址相同。
    ```
    A = 123
    B = 123
    print(A is B) #True
    print(id(A) == id(B)) #True
    ```
    当is判断返回为True时,表示两元素是同一个对象,位于同一内存中。
    3.`==`与`id`
    python使用==来表示数值是否相等。
    ```
    A = 2
    B = 6 / 3
    print(A == B) #True
    print(id(A) == id(B)) #False
    ```
    这里虽然数值大小相同,但A与B不位于同一变量。
    从上述介绍可以看到,is判断是否为同一引用,==判断数值是否相同。当is判断为True时,==也
    会为True,但==判断为True时,is不一定为True。
    ## 代码块
    what is code block?
    代码块是程序的基本执行单元。可以是一条语句、一个函数、一个类、一个模块、一个文件。
    只要是执行时以整体的形式运行,就叫代码块。
    比如在交互式方式中,比如`python`的idle中运行代码,每一行就是一个代码块。
    `>>> A = 123`,因为每输入一行它边运行一行代码。但在IDE比如pycharm写一个函数运行
    ```
    def add(m,n):
    print(f'{m} + {n} = {m + n}')
    add(1,2)
    ```
    运行时,函数中的每条语句都会运行,相当于把函数整体作为一个文件而运行最终输出结果。这时,
    `add()`函数的真个定义与调用就是一个代码块。
    ### 同一个代码块内的缓存机制
    python在执行同一个代码块的初始化对象时,如新建变量的时候。会先检查其值是否存在,如果
    存在会将其重用,也就是引用。具体实现是:执行同一个代码块时,遇到初始化对象的命令时,他
    会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果
    有同样的记录那么它会重复使用这个字典中的之前的这个值。
    ```
    >>> A = 123
    >>> id(A)
    140711580377728
    >>> B = 123
    >>> id(B)
    140711580377728
    ```
    从上述代码可以看到,变量A,B的值都是123,在查看变量B的id时发现与变量A的id一致。这里验证
    了缓存机制。这样做的好处是可以节省内存,避免重复创建。
    缓存机制使用的对象是:`int`、`float`、`str`、`bool`。
    特别的字符串有以下规定:
    1.非乘法运算的字符串都满足代码块的缓存机制
    2.乘法运算的字符串分两种情况
    1.乘数为1时,任何条件字符串都满足
    2.乘数>=2时,满足标识符且总长度<=20的字符串也满足
    这样做的好处是可以节省内存,避免重复创建,提升效率。

    ### 不同代码块的缓存机制--小数据池
    Python自动将-5~256的`整数`进行了缓存,当你将这些整数赋值给变量时,并不会重新创建对象,而
    是使用已经创建好的缓存对象。
    python会将一定规则的字符串在字符串驻留池中,创建一份,当你将这些字符串赋值给变量时,并
    不会重新创建对象, 而是使用在字符串驻留池中创建好的对象。
    其实,无论是缓存还是字符串驻留池,都是python做的一个优化,就是将~5-256的整数,和一定规则
    的字符串,放在一个‘池’(容器,或者字典)中,无论程序中那些变量指向这些范围内的整数或者字符串,
    那么他直接在这个‘池’中引用,言外之意,就是内存中之创建一个。
    适用对象: int(float),str,bool
    数字和bool类型很好理解,这里介绍以下字符串的机制:
    1.字符串长度为0或1默认采用驻留机制。
    2.字符串长度>1,只含有标识符内容,默认驻留
    3.乘法:
    1.乘数为1时
    1.只含标识符内容的,默认驻留
    2.含其他字符,长度为0或1,默认驻留
    3.含其他字符默认,长度>1,默认驻留
    2.乘数>=2时,只含标识符内容的,长度<=20,默认驻留
    4.还可以指定驻留--将字符串驻留在小数据池中
    ```
    from sys import intern
    a = intern('str' * 20)
    ```
    采用驻留机制的好处时节省内存,效率高。
  • 相关阅读:
    git --> 工作使用流程
    json-server-----》基本使用
    laravel DB listen 回调追踪产生 sql 语句的代码
    lumen 使用 laravel-cors 的时候, 使用 dd 函数的解决方法
    js 读写 cookie 简单实现
    API Authentication Error: {"error":"invalid_client","message":"Client authentication failed"}
    lumen passport Call to undefined method LaravelLumenApplication::group()
    laravel 嵌套事务
    mysql 5.7 json 字段类型查找、修改
    dingo 内部调用获取异常信息
  • 原文地址:https://www.cnblogs.com/peiziming/p/13160731.html
Copyright © 2020-2023  润新知