• Python-变量、变量作用域、垃圾回收机制原理-global nonlocal


      变量实现原理决定了Python使用的垃圾回收机制为变量引用计数,当这个对象引用计数为0时候,则会自动执行__del__函数回收资源, del方法只是把变量指向的对象引用计数减一而已并删除这个变量

    表达式: 运算符和操作符所构成的序列

    什么是变量?
      一种抽象,计算机用来保存现实数据的容器,通过这个变量抽象可以写入现实数据到计算机中,并且可以读取变量取到保存到计算机中的现实数字化数据

    在Python中变量名只是一个符号,而不是一个内存区块

    names = ("BeiMenChuiXue", "QiNiuYun")
    # 在动态语言中这样是可以的,但是在静态语言中这样会报错
    names = ("XiMenChuiFeng", "AliYun")
    print(names)
    

    Python变量赋值

    name = "beimenchuixue"
    age = 18
    height = 175
    # 并无关键字也不需要定义变量类型,直接通过 = 进行赋值
    

      

    变量类型

      1. 满足存储单个现实数据
        整形      int
        浮点型     float
        bool型      True(=1) False(=0)
        字符串     str
      2. 满足存储多个现实数据或归档现实数据
        列表     list
        元组     tuple
        字典     dict
        集合     set

    变量强制转换
      1. 浮点型 <> 整形,可能精度丢失

    int_num = 123456
    float_num = 12.333
    
    int_str = "123456"
    float_str = "12.333"
    
    print(int(float_num), float(int_num))
    print(int(int_str), float(float_str))

      2. 字符转数字,需要做异常处理
      3. 其他类型装字符 str() format() format_map()

    int_num = 123456
    float_num = 12.333
    bool_num = True
    
    print("int_num: %s, float_num: %s, bool_num: %s" % (int_num, float_num, bool_num))
    print("int_num: {int_num}, float_num: {float_num}, bool_num: {bool_num}".format(int_num=int_num, float_num=float_num, bool_num=bool_num))
    print("int_num: {int_num}, float_num: {float_num}, bool_num: {bool_num}".format_map({
        "int_num": int_num,
        "float_num": float_num,
        "bool_num": bool_num
    }))
    
    print(str(int_num), str(float_num), str(bool_num))

    变量命名规范

      1. 不能数字开头,大小写字母、下划线、数字

      2. 不能使用保留关键字和内置方法命名

      3. 区分大小写

    变量命名要求

      1. 命名知其意

      2. 简单的英文单词来标明一个变量,要么全部中文拼音,要么全部英文

      3. 用 _ 来区分两个单词

    Python变量本身没有类型,赋值后才有类型

    值类型

      一旦定义不能修改(变量指向的值不能修改只能重新定义)   int float bool str tuple

    引用类型

      定义之后可以修改(变量指向值可以动态修改)  list dict set

    查看变量内存地址    hex(id())

    多维度访问

      [index][index][index]

    常量

      不位于函数、类中变量(一旦定义禁止修改), 约定全部大写,本质上是全局变量

    变量作用域(变量有效范围),作用域链(逐层向上找变量)

              


      1. 全局变量,定义在模块中,作用于模块或整个应用程序

    name = "北门吹雪"
    
    
    def bei_men_chui_xue():
        print(name)
        return
    
    
    bei_men_chui_xue()

      2. 局部变量,定义在函数中,仅仅作用在函数内部,函数会首先找局部变量

    name = "北门吹雪"
    
    
    def bei_men_chui_xue():
        name = "beimenchuixue"
        print(name)
        return
    
    
    bei_men_chui_xue()

      3. 只能修改同一作用域的变量,可以访问上级变量但不可修改,修改通过 globalnonlocal(闭包中使用)声明

    name = "北门吹雪"
    
    
    def bei_men_chui_xue():
        # 申明name是全局变量
        global name
        print(name)
        # 修改全局变量
        name = "beimenchuixue"
        return
    
    
    bei_men_chui_xue()
    # 全局变量已改,不推荐如此做,因为全局变量在很多地方调用并使用
    print(name)
    def go_run(start):
        def step(step):
            # 申明start不是当前局部变量
            nonlocal start
            start += step
            return start
        return step
    
    
    run = go_run(0)
    # 跑了3步
    total_run = run(3)
    print(total_run)
    # 又跑了5步
    total_run = run(5)
    print(total_run)

      4. 变量作用域 全局、def 函数
      5. if + while + for 不能形成作用域, 其他语言如Golang中会形成作用域

    def bei_men_chui_xue():
        name = "beimenchuixue"
        # if 分支
        if name == "beimenchuixue":
            age = 18
        # 访问if分支中的变量
        print(age)
        return
    
    
    bei_men_chui_xue()

    # 变量好,生的巧,生在模块定全局,生在局部定函数,循环分支管不着,要想变,定官印,出了范围不见了,找它还得上级找

  • 相关阅读:
    Python python __def__ Exception AttributeError: "'NoneType' object has no attribute
    Python sys.argv[]用法
    Python 编写通过DOS压缩的例子遇到的几个问题
    DOS rar压缩
    Oracle游标介绍
    C#保存日志文件到txt中,可追加保存,定时删除最后一次操作半年前日志文件
    VS2008生成解决方案卡顿、龟速
    VS工具箱中添加DevExpress控件
    CLR 无法从 COM 上下文 0x208f68 转换为 COM 上下文 0x2090d8,这种状态已持续 60 秒
    命名空间"xx"已经包含了"xx"的定义
  • 原文地址:https://www.cnblogs.com/2bjiujiu/p/9061456.html
Copyright © 2020-2023  润新知