深入理解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的实 ...
随机推荐
- 【node.js】】MSBUILD : error MSB3428: 未能加载 Visual C++ 组件“VCBuild.exe”。
错误原因:缺少windows构建插件 解决方法: # (全局安装windows构建工具) npm install --global --production windows-build-tools
- 【Spring Boot&&Spring Cloud系列】Spring Boot中使用NoSql数据库Redis
github地址:https://github.com/AndyFlower/Spring-Boot-Learn/tree/master/spring-boot-nosql-redis 一.加入依赖到 ...
- C# 程序自动重启的解决方法
很多时候,我们有这样的场景,需要让程序自动重启,有很多种方法,比如用微软自带提供的方法,或者自己开辟新的线程重新调用.下面简单介绍两种方法. 方法一. 使用方法Application.Restart( ...
- 安装ORACLE_RAC遇到的问题与解决方法
while running: /u01/app/oracle/product/10.2.0/db_1/root.sh Checking to see if Oracle CRS stack is al ...
- sonarqube插件开发(三) 调试插件
环境 windows + eclipse +sonarqube server 5.6.4 准备 新建一个maven项目,其中加入了一些插件所用的jar <project xmlns=" ...
- netstat命令的安装
yum -y install net-tools (可以生成ifconfig命令,netstat命令)
- Apache 的mod_auth_cas模块的介绍和使用
apache的mod_auth_cas模块是一个集成到apache中的cas客户端,一般是配合Apache的反向代理来使用,对某个url的请求先经过apache,apache会判断是否经过cas认证, ...
- C语言如何产生随机数
1.基本函数 在C语言中取随机数所需要的函数是: int rand(void); void srand(unsigned int n); rand()函数和srand()函数被声明在头文件stdlib ...
- Maven属性(properties)标签的使用
在命令行使用属性时,是-D,比如:mvn -D input=test Properties 属性是了解POM基础知识的最后一个要素.Maven属性是值占位符,如Ant中的属性.它们的值可以通过使用符号 ...
- 50.TO_NUMBER 将给出的字符转换为数字
.SYSDATE 用来得到系统的当前日期 SQL> select to_char(sysdate,dd-mm-yyyy day) from dual; TO_CHAR(SYSDATE, ---- ...