变量不是盒子

变量是标注,而不是盒子。Python变量类似于Java中的引用式变量,因为最好理解为附加在对象上的标注。

对于引用式变量来说,说把变量分配给对象更加合理。把变量s分配给'xxx',而不是说把'xxx'分配给s。

示例,创建对象之后才会把变量分配给对象

>>> class Giz:

...     def __init__(self):

...             print('Giz id is{}'.format(id(self)))

...

>>>

>>> x = Giz()

Giz id is56583408

>>> y = Giz() * 10

Giz id is56583568

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

TypeError: unsupported operand type(s) for *: 'Giz' and 'int'

>>> dir()

['Giz', '__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'x']

最后使用dir()查询当前变量,看到了变量x,并没有变量y,因为赋值时抛出了异常。

标识、相等性 is ==

==是比较两个对象的值(对象保存的数据),is是比较对象的标识

每个对象都有标识、类型、值。对象一旦创建,它的标识绝不会变。

可以把标识理解为对象在内存中的地址。is运算符是比较两个对象的标识。id()函数返回对象标识的整数标识。

对象ID的真实意义在不同的实现中有所不同。在CPython中,id()返回对象的内存地址,但是在其他的Python解释器中可能是别的值。但是ID一定是唯一的数值标注,而且在对象的生命周期中绝不会变。

在变量和单例值之间比较时,应该使用is。比如比较变量是不是None:  x is None

is运算符比==速度要快。因为它不能重载,所以Python不需要寻找特殊方法,而是直接比较两个对象的整数ID。

而a == b是语法糖,等同于a.__eq__(b)。如果继承自object的__eq__不加以修改,就是比较两个对象的ID,结果和is一样。但是大多数内置类型都覆盖了__eq__方法,会考虑对象属性的值。

元组的相对不可变性

元组和多数Python集合(列表,字典、集合等等)一样,保存的是对象的引用。

而str、bytes、和array.array等类型是扁平的,保存的不是引用,而是在连续内存中保存数据的本身。

虽然元组是不可变的,但是引用的元素可以是可变的。也就是说元组的不可变性是值的tuple数据结构的物理内容(保存的引用)不可变,于引用的对象无关。

元组是否可散列,取决于它的元素是否是可散列的。如果它的元素全部是可散列的,那么这个元组就是可散列的。

Python变量的引用、标识、相等性 is和==区别相关推荐

  1. Python | 变量的引用

    一.变量的引用 变量 和 数据 都是保存在内存中的 在Python中函数的 参数传递 以及 返回值 的都是靠 引用 传递 1.引用 Python中: 变量 和 数据 是分开存储的: 数据保存在内存中的 ...

  2. python变量名称引用变量_Python:按变量名引用对象属性?

    我在用Python编写棋盘游戏专卖版.垄断有三种类型的土地,玩家可以购买:财产(如木板路),铁路和公用事业.房产的购买价格和租金在6种情况下都是可变的(0-4套房子或一家酒店).铁路和公用事业有一个固 ...

  3. Python变量和参数传递

    目录 (1)Python变量不能独立存在 (2)变量是内存中数据的引用 3.Python的参数传递(重点) 1.Python的变量 (1)Python变量不能独立存在 比如在 C++ 等语言中,变量的 ...

  4. python中的变量的引用_python中的变量引用小结

    python的变量都可以看成是内存中某个对象的引用.(变量指向该内存地址存储的值) 1.python中的可更改对象和不可更改对象 python中的对象可以分为可更改(mutable)对象与不可更改(i ...

  5. python 变量引用_Python 知识要点:变量及引用

    变量使用前必须赋值,变量赋值后才会被创建. 变量名 = 值 变量的命名:可以由字母,数字,下划线组成,不能以数字开头,不能与关键字重名,每个单词小写. 定义变量时不需要指定变量的类型,在内存中创建一个 ...

  6. python函数里面引用外部变量_Python基础 变量进阶

    目标 变量的引用 可变和不可变类型 局部变量和全局变量 01. 变量的引用 变量 和 数据 都是保存在 内存 中的 在 Python 中 函数 的 参数传递 以及 返回值 都是靠 引用 传递的 1.1 ...

  7. python变量回收_Python变量的引用、拷贝和回收机制

    1.Python中变量的引用 Python中的变量都是指针,都是某个内存对象的引用. python不允许程序员选择采用传值还是传引用.Python参数传递采用的肯定是"传对象引用" ...

  8. Python中的变量、引用、拷贝和作用域

    在Python中,变量是没有类型的,这和以往看到的大部分编辑语言都不一样.在使用变量的时候,不需要提前声明,只需要给这个变量赋值即可.但是,当用变量的时候,必须要给这个变量赋值:如果只写一个变量,而没 ...

  9. python一个对象只能被一个变量引用吗_python中的对象、变量、引用的问题

    对象.变量.引用 对象 对象包括 不可变对象 和 可变对象.但从某种意义上来说,可变和不可变并不是对立关系. int,string,float,tuple 这四类属于 不可变对象.这里不可变的含义是: ...

最新文章

  1. 树莓派配置路由_树莓派安装Ubuntu 20.04 LTS并配置
  2. 项目实战解决 java.sql.SQLException: Unable to load authentication plugin ‘caching_sha2_password‘.
  3. debug the very first SAP Fiori application -Jerry的第一个SAP ui5应用调试经过
  4. 露出暴露自拍论坛_如何照出高质感的自拍?——18个技巧,值得收藏
  5. IOS 深拷贝和浅拷贝应用
  6. fastjson 1.1.31 发布,Java 的 JSON 库
  7. ssh远程登录报错:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED
  8. Julia : 类型别名
  9. 任务栏管理器无法结束任务 taskkill也无法结束任务 pchunter加载驱动失败
  10. 数字金额转化为中文大写
  11. 基于Python的医院信息管理系统的设计与实现
  12. 苹果商店打不开怎么办_苹果手机下载迅雷方法,iOS迅雷安装,怎么安装苹果版迅雷...
  13. wincc安装服务器系统,wincc7.4安装硬件要求
  14. 最新触摸精灵开发教程(价值300
  15. python下划线怎么输入_Python中下划线的使用方法有哪些
  16. jQuery 三种点击事件写法
  17. 位 字节 千字节 兆字节 (bit Byte KByte MByte GByte TByte)
  18. word2vec源码解读
  19. 压箱底的Mac解压缩软件大放送
  20. ADSafe导致github等很多网站无法打开

热门文章

  1. 关于初学者Invalid byte tag in constant pool: 19错误
  2. 深度学习网络结构汇总(21种网络结构)
  3. 学习笔记(22):第一章: 路由与模板-Web前端技术与框架 3
  4. 如何升级到 React 18
  5. Java操作Excel工具类
  6. Zotero + Zotfile + NutSync 简直文献管理神器
  7. 树的高度和深度 定义
  8. spring cloud微服务分布式云架构 - Spring Cloud集成项目简介(三)
  9. 远程视频监控之应用篇(all_test)
  10. Python爬虫 - Selenium(4)配置启动项参数