python学习(九)python中的变量、引用和对象的关系
2017-10-21 21:59
330 查看
《Think In Java》中说到过"万事万物皆对象",这句话也可以用在Python中。
感觉Python中的变量有点像Javascript中的变量,是弱类型的,但是Python中的变量貌似要更加灵活,啥都不用写:
a = 3这样就声明赋值做了,简直了。
你不用想这个变量前面应该用int,double亦或是Long,还是某个类型的名字,你想用变量的时候随便取个合适的名字就好,Python会知道的;同时你也不用去考虑没有赋初始值的问题(这句话我错了,还是先要赋值才能用)。
Python是强类型的,但是变量不存在类型,对象存在类型。
Python是强类型的,但是变量没有类型,不管怎么样,变量都会指向一个对象吧,就算是None。虽然变量没有类型,但是变量指向的对象是有类型滴。不知道这么说会不会晕,要是有了Java的基础或者其他面向对象的编程经验其实很好理解。
Python对象的类型以及变量所指的对象的类型是在运行阶段。
Python是动态的解释执行的语言,应该是没有编译阶段的,这只是我的理解啊。所谓运行阶段就是当你要操作或者访问这个对象的时候,比如你要对字符串求长度,或者你要求2+3的值,再或者'2' + '3'这种操作,都是要知道它们具体是属于哪种来类型的。这种现象在面向对象中称之为多态。
假设现在有一张银行卡,那么这张银行卡和我平常使用的银行卡不同,我们的银行卡和我们账户的卡号是绑定的,但是 现在我所假设的这张银行卡并没有和卡号绑定,而是可以把账户号重新写入银行卡。
银行里面会制卡,也就是很多空白的银行卡(空白的银行卡就像很多的变量都指为None),这些空白的银行卡是没有与任何帐号关联的。当我们去银行开户的时候,银行职员会拿一个空卡,让后将我们开户的帐号写进去。那么我们知道银行的账户也分为很多类型,有VIP客户,由普通的储户,还有白金会员,黄金会员等,这种情况就类似于Python中有很多不同的类型一样,我们去银行开户也会是这些账户类型中的一种,我们开的账户就相当于账户类型中的一个对象。而我们手中和那个账户关联的银行卡则相当于一个变量。我们不同直接去操作我们的账户,而是要通过银行职员或者ATM这样的途径去操作我们的账户,这个过程就相当于引用。
当我们的账户不想用了,银行会回收我们的卡,然后将它和其他人的账户对应并给他们用,或者我们直接把卡扔了,银行会自动删除我们的账户。
写的好乱啊。
不如来分析下在Python中,这两句话会发生什么?
1. 3是一个数字,但同时也是一个对象,Python获取对象3的引用,然后这个引用赋给a,然后我们就可以通过变量a来操作3这个对象了;
2. 2 + a,Python会先通过a找到a所指向的对象,也就是3,然后确定3是哪种类型,然后Python也知道2是哪种类型,然后根据2和3这两个对象的类型以及+号判断该进行何种操作;在这里的话就是加法运算了,然后会得到一个5的对象;
3. 然后将5这个对象的引用赋给a,此时a就指向了另外对象了。
所有的变量必须在使用前明确赋值,使用未赋值的变量会产生错误。
Python会自动跟随变量到对象之间的连接:
变量是一个系统表的元素,拥有指向对象的连接的空间
对象是分配的一块内存,有足够的空间去表示它们所代表的值
引用是自动形成的从变量到对象的指针
Python在内部会进行优化,缓存了不变的对象并对其进行复用,例如小的整数和字符串。
每个对象除了会保存它的值之外,每个对象都有两个标准的头部信息:
一个类型标志符去标识这个对象的类型,
然后还有一个引用计数器,用来决定是不是可以回收这个对象。
整个过程和b半毛钱关系没有。
Python中判断对象是否相等:
"=="操作符,测试两个对象是否有相同的值
"is"操作符,检查两个对象是不是同一个,跟值没啥关系,就算两个不同对象所拥有的值一样,通过is操作之后返回的是False,而不是True。
如果两个变量精确的指向同一个对象,则会返回True。
查询一个对象被引用的次数
感觉Python中的变量有点像Javascript中的变量,是弱类型的,但是Python中的变量貌似要更加灵活,啥都不用写:
a = 3这样就声明赋值做了,简直了。
变量不用声明哦
在Python中,不用声明变量的存在和类型,可以直接使用。你不用想这个变量前面应该用int,double亦或是Long,还是某个类型的名字,你想用变量的时候随便取个合适的名字就好,Python会知道的;同时你也不用去考虑没有赋初始值的问题(这句话我错了,还是先要赋值才能用)。
Python是强类型的,但是变量不存在类型,对象存在类型。
Python是强类型的,但是变量没有类型,不管怎么样,变量都会指向一个对象吧,就算是None。虽然变量没有类型,但是变量指向的对象是有类型滴。不知道这么说会不会晕,要是有了Java的基础或者其他面向对象的编程经验其实很好理解。
Python对象的类型以及变量所指的对象的类型是在运行阶段。
Python是动态的解释执行的语言,应该是没有编译阶段的,这只是我的理解啊。所谓运行阶段就是当你要操作或者访问这个对象的时候,比如你要对字符串求长度,或者你要求2+3的值,再或者'2' + '3'这种操作,都是要知道它们具体是属于哪种来类型的。这种现象在面向对象中称之为多态。
变量、对象和引用
对于这个我也找不到很好的例子来说明关系,但我尽量。假设现在有一张银行卡,那么这张银行卡和我平常使用的银行卡不同,我们的银行卡和我们账户的卡号是绑定的,但是 现在我所假设的这张银行卡并没有和卡号绑定,而是可以把账户号重新写入银行卡。
银行里面会制卡,也就是很多空白的银行卡(空白的银行卡就像很多的变量都指为None),这些空白的银行卡是没有与任何帐号关联的。当我们去银行开户的时候,银行职员会拿一个空卡,让后将我们开户的帐号写进去。那么我们知道银行的账户也分为很多类型,有VIP客户,由普通的储户,还有白金会员,黄金会员等,这种情况就类似于Python中有很多不同的类型一样,我们去银行开户也会是这些账户类型中的一种,我们开的账户就相当于账户类型中的一个对象。而我们手中和那个账户关联的银行卡则相当于一个变量。我们不同直接去操作我们的账户,而是要通过银行职员或者ATM这样的途径去操作我们的账户,这个过程就相当于引用。
当我们的账户不想用了,银行会回收我们的卡,然后将它和其他人的账户对应并给他们用,或者我们直接把卡扔了,银行会自动删除我们的账户。
写的好乱啊。
不如来分析下在Python中,这两句话会发生什么?
#!/usr/bin/python a = 3 a = 2 + a print(a)
1. 3是一个数字,但同时也是一个对象,Python获取对象3的引用,然后这个引用赋给a,然后我们就可以通过变量a来操作3这个对象了;
2. 2 + a,Python会先通过a找到a所指向的对象,也就是3,然后确定3是哪种类型,然后Python也知道2是哪种类型,然后根据2和3这两个对象的类型以及+号判断该进行何种操作;在这里的话就是加法运算了,然后会得到一个5的对象;
3. 然后将5这个对象的引用赋给a,此时a就指向了另外对象了。
所有的变量必须在使用前明确赋值,使用未赋值的变量会产生错误。
Python会自动跟随变量到对象之间的连接:
变量是一个系统表的元素,拥有指向对象的连接的空间
对象是分配的一块内存,有足够的空间去表示它们所代表的值
引用是自动形成的从变量到对象的指针
Python在内部会进行优化,缓存了不变的对象并对其进行复用,例如小的整数和字符串。
每个对象除了会保存它的值之外,每个对象都有两个标准的头部信息:
一个类型标志符去标识这个对象的类型,
然后还有一个引用计数器,用来决定是不是可以回收这个对象。
类型属于对象,而不是变量。
一个变量可以指向不同类型的变量。对象的垃圾收集
共享引用
不同的变量可以引用同一个对象(指向了相同的内存空间)。a = 3 b = a a = 'spam'对a重新赋值并不会改变b引用的对象。这里只是将变量a和对象3解引用,然后让a引用另一个对象,也就是字符串'spam'。
整个过程和b半毛钱关系没有。
共享引用和在原处修改
#!/usr/bin/python L1 = [1, 2, 3] L2 = L1 L2.append("heheda") print(L1)
Python中判断对象是否相等:
"=="操作符,测试两个对象是否有相同的值
"is"操作符,检查两个对象是不是同一个,跟值没啥关系,就算两个不同对象所拥有的值一样,通过is操作之后返回的是False,而不是True。
如果两个变量精确的指向同一个对象,则会返回True。
L = [1, 2, 3] M = [1, 2, 3] L is M # 返回的是False
X = 42 Y = 42 X == Y # 返回的是True, 因为Python会缓存小的整数
查询一个对象被引用的次数
import sys sys.getrefcount(1)
相关文章推荐
- java学习心得:关于对象与引用变量的关系的理解
- python对象、引用、全局变量和局部变量的关系
- Python----__str__ 输出对象变量,默认会输出引用的对象。
- [零基础学Python]深入变量和引用对象
- python变量、引用、拷贝之间的关系
- 零基础学python-6.1 变量、对象与引用
- python 共享引用:多个变量引用同一对象
- 对python变量和对象引用的探讨
- python学习笔记4(对象/引用;多范式; 上下文管理器)
- python学习笔记---对象赋值其实就是引用
- python函数参数是值传递还是引用传递(以及变量间复制后是否保持一致):取决于对象内容可变不可变
- python 变量赋值引用的一点学习笔记
- Python对象引用(变量)
- Python 变量 对象 引用
- python函数参数是值传递还是引用传递(以及变量间复制后是否保持一致):取决于对象内容可变不可变
- Python中的变量引用对象需注意的几点
- python的全局变量(属性的用法),私有属性,计算对象引用数
- 【日常小坑】关于python3操作数据库实用占位符传入引用变量问题,做个Mark(python学习第一天)
- python学习笔记7:对象引用与对象