你想了解Python中的 == 和IS 其他?
前言
比较对象值时使用 == 等逻辑操作符,比较的是对象的值;比较对象身份时使用 is 和 is not 操作符,比较的是对象的本身,即可理解为对象的地址,该地址可以由id()函数获得。
理解过程中可以类比 C 语言中变量的比较,例如对于变量 a 和 b,比较值相当于 a == b,比较身份相当于 &a == &b,即对两个变量分别取地址,之后比较这两个地址。
Python 中使用大量使用引用赋值。通过 b = a 的操作,C 语言中是将 a 的值赋给 b,两个变量的地址不同;Python 中则通过引用赋值,直接使 b 和 a 指向相同的地址,这样就可以复用内存,使得存储更高效。
不过在使用过程中,对于不可改变类型,或者表述为“标量存储类型”,这个操作对于用户是透明的,即对于用户来说相当于普通复制赋值,如下。使用 b = a 赋值后,可以看到,两个变量的 id 是相同的,即内存中地址相同。改变 b 的值后可以看到,系统自动给 b 分配了新的地址空间,改变 b 并没有引起 a 的改变。
>>> a = 1 >>> b = a >>> id(a) 29667592L >>> id(b) 29667592L >>> b += 1 >>> a 1 >>> b 2 >>> id(a) 29667592L >>> id(b) 29667568L
对于可变类型,Python 真的是使用引用赋值,如下。可以发现对于 list 类型,改变了 b 的值后 a 也随之改变,两个变量的地址是相同的。
>>> a = [1, 2] >>> b = a >>> id(a) 34412232L >>> id(b) 34412232L >>> b += [3] >>> a [1, 2, 3] >>> b [1, 2, 3] >>> id(a) 34412232L >>> id(b) 34412232L
若需要对于 list 类型使用复制赋值,需要使用技巧 b = a[:],此时系统会为 b 分配新的地址,并赋予之一份 a 的拷贝,如下。
>>> a = [1, 2] >>> b = a[:] >>> a [1, 2] >>> b [1, 2] >>> id(a) 34520264L >>> id(b) 34520456L >>> b += [3] >>> a [1, 2] >>> b [1, 2, 3] >>> id(a) 34520264L >>> id(b) 34520456L
Python 中对于内存的管理是自动的,不需要程序猿参与。系统对于每个变量的内存空间添加了一个计数器,没增加一个引用,即有新的指针指向这个地址时,就对计数器加一,反之减一。当计数器的值为 0 时,系统回收这块内存。当使用 del 操作时,直接将该变量所在内存的计数器置为 0,即直接删除之。
这种管理方式在 Linux/Unix 的文件系统中也在使用,*nix 系统采用 inode 格式来管理文件。这种管理方式采用唯一的 id 来标识文件,而文件名只是一个普通属性,因此可以在文件打开过程中修改文件名。每当对于文件创建一个新的硬链接,系统就会将文件的计数器加一,当计数器的值为 0 时,表示文件被删除。
小编推荐一个学python的学习qun 740322234
无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
python模块: urllib模块详解 !!
前言相信大家在做一个Python项目的时候,肯定会用到模块,就想JAVA会用到JAR包一样,这样会让我们的开发更高效和更简洁,本节为大家介绍一个URLlib模块 在python中urllib模块提供上层接口,可以使用它下载读取数据,这里举个例子,把sina首页的html抓取下来显示出来.有2种方法可以实现. 1.urlopen(url, data=None, proxies=None) urlopen(url [, data]) -> open file-like object 创建一个表示远程url的类文件对象,然后像本地文件一样操作这个类文件对象来获取远程数据。参数url表示远程数据的路径,一般是网址;参数data表示以post方式提交到url的数据;参数proxies用于设置代理.urlopen返回一个类文件对象. #!/usr/bin/python2.5 import urllib url = "http://www.sina.com" data = urllib.urlopen(url).read() print data``` root@10.1.6.200:~# p...
- 下一篇
React的组件模式
摘要: 组件是 React 的核心。 原文:React的组件模式 作者:前端小智 Fundebug经授权转载,版权归原作者所有。 组件是 React 的核心,因此了解如何利用它们对于创建优秀的设计结构至关重要。 什么是组件 根据 React 官网的介绍,“组件让你可以将 UI 分割成独立的、可重用的部分,并独立管理每个部分。” 当你第一次安装 npm install react 时,会得到一件事:组件及其 API。与 JavaScript 函数类似,组件接受名为 “props” 的输入并返回 React 元素,该元素描述(声明)用户界面(UI)的外观。这就是为什么 React 被称为声明性 API,因为你告诉它你希望 UI 是什么样子的,而 React 负责其余的工作。 可以把声明式想像成当打的去一个目的地时,只需要告诉司机去哪里,他就会开车把你送到那里。命令式编程正好相反—,你得自己驾车到那里。 组件的 API 当安装 React 后,便可以使用 React 提供的 API,基本可以分成 5 种。 render state props context lifecycle events...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8编译安装MySQL8.0.19
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2全家桶,快速入门学习开发网站教程