Skip to content

Latest commit

 

History

History
264 lines (173 loc) · 6.32 KB

057-851184-关键字_keyword_变量名与下划线_dunder_声明与赋值.sy.md

File metadata and controls

264 lines (173 loc) · 6.32 KB
show version enable_checker
step
1.0
true

变量名下划线

回忆上次内容

  • 上次直接从模块中导入变量、函数
    • from my_file import pi
      • 导入show_time.pi
      • 并作为pi变量使用
    • from my_file import pi as my_pi
      • 导入变量并重命名

图片描述

  • 突发奇想~
    • 这个import可以作为标识符来使用吗??🤔

尝试

  • 可以将 import当 变量名吗?

图片描述

  • isidentifier函数
    • 有不灵的 时候吗?
  • 这怎么理解呢??🤔

翻看文档

  • import 属于关键字

图片描述

  • 关键字
    • 就有有特殊功能的字符串
    • 都是 不能作为 标识符 的
  • 类似的还有True

True

  • 从标识符命名规则来说
    • 字符串"True"符合命名规则

图片描述

  • 但是True有特殊含义
    • 不能被声明和赋值
    • 属于关键字

图片描述

  • 如果只有一个下划线
    • 也是一个变量吗?

上次的值

  • 在游乐场里
    • _下划线 意味着上次的值

图片描述

  • 如果是下划线开头的变量呢?

下划线的含义

图片描述

  • 所以 _a 可以作为
    • 模块内部的变量或者函数

图片描述

  • 如何理解内部呢?

理解内部

图片描述

  • 在random模块中有很多变量和函数
    • 有下划线 算是内部的
    • 没有下划线 不算是内部的
  • from random import *
    • *代表所有的外部变量和函数

图片描述

  • 导入进来的
    • 都是没有下划线的
    • 也就是说内部的没有导入进来
  • 如果就想要导入内部的变量呢?

变量

  • 点名导入带下划线的变量
    • 就可以了

图片描述

  • 如果在变量名后面
    • 加下划线呢?

后面的下划线

  • 在后面加上下划线
    • 一般是为了 区分已经有的标识符

图片描述

  • 这样会对函数名max强行赋值

    • 从此max函数就失效了
  • 班里面有个张伟

    • 新来一个就不能叫张伟
    • 只能叫 大张伟 或者 小张伟

图片描述

  • 如果使用max 作为变量名
    • 会把max函数 屏蔽掉
  • 使用max_
    • 不会屏蔽 max函数

两端双下划线(dunder)

图片描述

  • 系统定义的标识符
    • 模块名
    • 函数名
    • 变量名

图片描述

  • dunder变量都是有用意的

    • 不要轻易破坏
  • 再回头

    • 来看看 a 这个变量 的 声明和赋值

细节

  • a 两边并不加引号
    • 因为 这里的 a 是 变量标识符
    • 而不是 字符串
      • 如果加了双引号 就是字符串了

图片描述

  • 在等号两端 都保留 有一个空格
    • 可是 为什么要 加空格呢?

可读性

  • 增加文档的可读性
    • 不会 影响程序的执行速度

图片描述

  • 这两句话从何说起

加空格的原因

  • 这两句话来自于python之禅

图片描述

  • 现在到底有多少变量呢?

locals()

  • 查询本地变量
    • 有一个内置的函数叫做 locals

图片描述

  • 可以查询关于 locals 的帮助

local函数

  • locals()返回的
    • 是 一个 包含当前域中
      • 所有变量的字典

图片描述

  • 声明和赋值 都使用等号
    • 声明并赋值 变量a 之后
    • 变量a 在内存里真的有位置了么?

图片描述

  • 这个id具体在计算机中的什么位置呢?
    • 我们来看看

具体位置

图片描述

  • id函数是什么意思?
    • help(id)

图片描述

  • id返回 对象o的标识符
    • o 确实在内存中 有了位置
      • 但是如果 我们给变量新赋 一个值
  • 那么 存储变量的位置
    • 还是那个 内存地址 么?

实践

  • 虽然 a这个变量名 没有变
    • 但是 id(a)变了
    • a所指向的地址空间变了

图片描述

  • 也就是说
    • a这个容器的 内存位置没变
    • 但是 a容器中 存的地址引用变了
      • 所指向的 变量
        • 在内存中的地址引用 变了
  • 两次赋值 都是存储到a这个 变量名里面
    • 第二次赋值 和 第一次赋值
      • 有什么区别吗?

区别

  • 变量的声明和赋值究竟有什么不同
    • 第一次赋值时
      • 声明和赋值是同时完成的

图片描述

  • 如果是 第二次赋值 呢?

纯赋值

  • 声明了之后
    • 再有 等号赋值 就是 第二次赋值

图片描述

  • 是 纯赋值
    • 没有声明新的变量

总结

  • 这次 了解了isidentifier的细节
    • 关于 关键字
    • 关于 下划线
  • 如何查询 变量所指向的地址?
    • id
  • 如何查询 已有的各种变量?
    • locals
  • 如果 用一个变量a的值
    • 给另一个变量b 赋值
    • 是什么样的过程 呢??🤔
  • 我们下次再说!👋