深入理解python之一——python3对象的一些特性
文章使用markdown写的,编辑的时候行间距还可以,显示的时候行间距好小,我也没办法。
首先,需要明白的是python是一种解释性语言标准,他可以由c、java或者其他语言来实现。在python的标准中,变量是链接式的。举个例子来说,内存中的对象和变量就像是给内存对象贴变量名标签而不是给变量盒子装入东西(数值信息)。或者说是给对象分配变量名,而不是给变量赋值。因为python对象在执行赋值之前就已经创立存在了的。
对象标识和变量名
id()返回对象的标识,cpython中id()返回的是唯一的内存地址,变量名则是一个便于理解的别名。
is和==的区别
is需要值和内存地址都相等,只需要值相等。对于此更直观的表示可以执行一下id(),就可以看到不同。
is比更快,不能重载,直接比较的是id。
变量的可变性
在基础阶段,很多教程都会提到,元祖是不可变的数据类型,所以没有插入和删除的操作,只能一次定义。但深究这个问题起来,其实元祖只是在引用上不能变化,但引用的对象是可变的,就导致元祖的值会跟着列表发生变化。浅复制时,多个变量引用同一列表地址,那么改变一个其他也会变。深复制是在内存中重新开辟一个区域,将原来的对象包括其中为对象引用的内容,一同复制到新的区域,并建立新的引用。引用变量的可变性看的是最小对象单位的类型,比如不可变元组中有可变列表对象,列表就是最小的单位,要看它的可变性。列表是可变的,这种特性使得在指向同一个列表对象的情况下,列表实际的长度和值是可以改变的。对其他的类型对象一般不可变,也就不会发生上述变化。
最大的威胁在于,将列表作为参数传给类方法的时候,类变量和参数绑定了同一个对象,执行完返回后原来的传入参数的对象发生了变化。除了刻意要去改传入的列表,否则应该在这之前深复制一个副本,不影响原来的变量的使用。
创建列表的几种写法
a = [1,2,3]
b=a
b is a
>>True
c = list(a)
c is a
>>False
d = a[:]
d is a
>>False
类似上面使用b=a这样的办法创建的列表,其实只是新建了一个引用,并没有新建一个对象。如果改变a、b其中一个,另一个会随着改变。
深复制和浅复制的具体区别
copy模块可以完成浅复制和深复制,分别对应方法copy()和deepcopy()。其中,deepcopy()可以完成对包含循环引用的对象的拷贝。
具体可以用下面的a分别做两种拷贝,会发现其中深拷贝得到的a[1]的内容和另外两者是不一一样的。
a = (1,[2,3],(4,5))
使用两种拷贝分别复制后查看结果。
深入理解python之一——python3对象的一些特性的更多相关文章
- python 进阶读书笔记1 -- 理解python一切皆对象
理解python一切皆对象: 1.所有的类都是由type创建的 2.所有的类的基类都是object 3.type是类,也是实例,type的基类是object,type对象是由type创建的 4.obj ...
- python学习之对象的三大特性
在面向对象程序设计中,对象可以看做是数据(特性)以及由一系列可以存取.操作这些数据的方法所组成的集合.编写代码时,我们可以将所有功能都写在一个文件里,这样也是可行的,但是这样不利于代码的维护,你总不希 ...
- python 引用和对象理解
今天浏览博客的时候看到这么一句话: python中变量名和对象是分离的:最开始的时候是看到这句话的时候没有反应过来.决定具体搞清楚一下python中变量与对象之间的细节.(其实我感觉应该说 引用和对象 ...
- 完全理解 Python 迭代对象、迭代器、生成器(转)
完全理解 Python 迭代对象.迭代器.生成器 本文源自RQ作者的一篇博文,原文是Iterables vs. Iterators vs. Generators » nvie.com,俺写的这篇文章是 ...
- 完全理解 Python 迭代对象、迭代器、生成器
完全理解 Python 迭代对象.迭代器.生成器 2017/05/29 · 基础知识 · 9 评论 · 可迭代对象, 生成器, 迭代器 分享到: 原文出处: liuzhijun 本文源自RQ作者 ...
- python 引用和对象理解(转)
引用和对象分离 从最开始的变量开始思考: 在python中,如果要使用一个变量,不需要提前进行声明,只需要在用的时候,给这个变量赋值即可 (这个和C语言等静态类型语言不同,和python为动态类型有关 ...
- 正确理解Python函数是第一类对象
正确理解 Python函数,能够帮助我们更好地理解 Python 装饰器.匿名函数(lambda).函数式编程等高阶技术. 函数(Function)作为程序语言中不可或缺的一部分,太稀松平常了.但函数 ...
- 深入理解python对象及属性
类属性和实例属性首先来看看类属性和类实例的属性在python中如何存储,通过__dir__方法来查看对象的属性 >>> class Test(object): pass>> ...
- Python类与对象的理解
注意python的类对象与实例对象的区分 类对象与实例对象是相对的,例如:a=1,那么a就是int的一个实例对象,这里的a相对于int来说,a是实例对象,int是类对象.但是int同时又是type的实 ...
随机推荐
- spring基础---->spring自定义初始化(一)
这里我们简单的实现一下spring中的初始化bean,以大概了解他的流程.受委屈几乎是一个人成长最快的途径,吃下去的是委屈,消化掉后得到的是格局. spring的自定义初始化 测试的项目结构如下: 一 ...
- android第三方---->android智能机器人的使用
在网上找了个第三方智能机器人,可以实现聊天语音等功能,比较不错的.今天我们就开始智能机器人聊天的学习,例子中涉及的handler的有关知识和json数据的解析,请参见我的博客:android基础--- ...
- 【转】C++可变参数列表处理宏va_list、va_start、va_end的使用
VA_LIST是在C语言中解决变参问题的一组宏他有这么几个成员: 1)va_list型变量: #ifdef _M_ALPHA typedef struct{ char* a0; /*po ...
- 【大数据系列】windows搭建hadoop开发环境
一.安装JDK配置环境变量 已经安装略过 二.安装eclipse 已经安装略过 三.安装Ant 1.下载http://ant.apache.org/bindownload.cgi 2.解压 3.配置A ...
- 微信小程序插件内页面跳转和参数传递(转)
在此以插件开发中文章列表跳传文章详情为例. 1.首先在插件中的文章列表页面wxml中绑定跳转事件. bindtap='url' data-id="{{item.article_id}}&qu ...
- Ubuntu 最好用的CHM阅读器KchmViewer
直接在“ubuntu软件中心”进行搜索安装 为什么说它是最好用?很简单!可同时显示目录和内容,中文没乱码!能实现这两点的竞争对手已经不多了,至少我是没发现.什么chmsee,gnochm,都有乱码.虽 ...
- 使用Maven命令安装jar包到仓库中
项目中可能会碰到很多jar包,使用maven update不能更新,或者jar包是拷贝过来,不能编译的情况.此时就需要手动使用命令行安装. 例如Demo项目中提示缺少四个jar包,但是在repo中已经 ...
- sencha touch 常见问题解答(26-50)
26.sencha touch在华为.红米等部分手机下hide事件失效,msgbox无法关闭怎么办 答:请看http://www.cnblogs.com/cjpx00008/p/3535557.htm ...
- linux的shell后门尝试以及Cython转成C代码编译
零.背景 最近研究了一下之前的反弹shell的python代码块,写了一点代码尝试在LInux下绑定和反弹shell(正反向),看了一些代码,基本是两种思路.1.本地shell的输入输出通过管道与so ...
- Linux下应急工具
Linux下的应急工具 在Linux下,应急的查看点无非那个几个,一是看表现(宕机.高CPU.高内存.高IO.高网络通信),二看连接.三看进程.四看日志.五看文件(Linux一切皆文件),再者结合起来 ...