深入理解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的实 ...
随机推荐
- C++空类
class Empty { public: Empty(); // 缺省构造函数 Empty( const Empty& ); // 拷贝构造函数 ~Empty(); // 析构函数 Empt ...
- [原]rpm安装rpm-package报错:Header signature NOKEY 和 error: Failed dependencies:
以前经常遇到这个问题,一直未有记录,今天记录下来: 在安装rpm包的时候报错误如下: Question 1: warning: *.rpm: Header V3 DSA signature: NOKE ...
- ConfluenceRemoteUserAuth
配置confluence使用httpHeader的方式进行登录(目标版本:atlassian-confluence-6.3.3) 前提是已经安装好了Confluence,并且前端使用apache或者n ...
- android中SimpleCursorAdapter _id错误的问题
作为一个android新手,在绑定数据的时候是这样的 ListView listview=(ListView)this.findViewById(R.id.listView1); XJDal xj=n ...
- mysql补充(3)优化sql语句查询常用的30种方法
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索 ...
- Docker定制容器镜像(利用Dockerfile文件)
1.创建Dockerfile文件 新建一个目录,在里面新建一个dockerfile文件(新建一个的目录,主要是为了和以防和其它dockerfile混乱 ) [root@docker01 myfiles ...
- PHP----实现压缩HTML
很多时候,我们在做优化处理的时候,会考虑压缩HTML,去掉HTML里面的空格和换行. 具体实现: public function change(){ echo "change"; ...
- Docker容器挂载宿主目录的情形分析
Docker容器启动的时候,如果要挂载宿主机的一个目录,可以用-v参数指定. 譬如我要启动一个centos容器,宿主机的/test目录挂载到容器的/soft目录,可通过以下方式指定: # docker ...
- iptables、防火墙配置、NAT端口映射
一,配置一个filter表放火墙 (1)查看本机关于IPTABLES的设置情况 [root@tp ~]# iptables -L -n Chain INPUT (policy ACCEPT) targ ...
- IIS 下载文件 报错“401 - 未授权: 由于凭据无效,访问被拒绝。”
点开身份验证 改为启用就OK了 重启一下IIS. 如果你上在办法没有解决可参考 1.打开“IIS信息服务管理器”——>选择你发布的网站——>选择功能视图中的“身份验证”——>右键匿名 ...