《Think In Java》中说到过"万事万物皆对象",这句话也可以用在Python中。

感觉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)

python学习(九)python中的变量、引用和对象的关系的更多相关文章

  1. Python中的变量引用对象需注意的几点

    Python中的变量引用对象需注意的几点 分类:Python (55)  (0) 普通引用: Python中,变量的作用仅仅是一个标识,只有赋值后才被创建,它可以引用任何类型的对象,而且在引用之前必须 ...

  2. Python学习day09 - Python进阶(3)

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  3. Python学习day05 - Python基础(3) 格式化输出和基本运算符

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  4. MyBatis mapper文件中的变量引用方式#{}与${}的差别

    MyBatis mapper文件中的变量引用方式#{}与${}的差别 #{},和 ${}传参的区别如下:使用#传入参数是,sql语句解析是会加上"",当成字符串来解析,这样相比于$ ...

  5. ][mybatis]MyBatis mapper文件中的变量引用方式#{}与${}的差别

    转自https://blog.csdn.net/szwangdf/article/details/26714603 MyBatis mapper文件中的变量引用方式#{}与${}的差别 默认情况下,使 ...

  6. 深刻理解Java中形參与实參,引用与对象的关系

    声明:本博客为原创博客,未经同意.不得转载! 原文链接为http://blog.csdn.net/bettarwang/article/details/30989755 我们都知道.在Java中,除了 ...

  7. Javascript 判断 iframe 中的变量是否为对象

    Javascript 判断 iframe 中的变量是否为对象 前言 公司之前的项目中,为了实现模块化,在 web 后端使用了 iframe 来组织框架和页面.由于当时没有很好地规划,iframe 子页 ...

  8. Python学习(21):Python函数(5):变量作用域与闭包

    转自 http://www.cnblogs.com/BeginMan/p/3179040.html 一.全局变量与局部变量 一个模块中,最高级别的变量有全局作用域. 全局变量一个特征就是:除非被删除, ...

  9. Python学习笔记 (2)变量、常量和数据类型

    变量 顾名思义,变量就是一个会变的量,用一个变量名表示,指向内存中一片区域,而指向的区域存的是什么,这个变量就是什么数据类型,和C/C++挺不一样的.变量数据类型可以通过赋值变来变去(这就叫动态语言, ...

随机推荐

  1. 如何查看用pip命令安装的软件的安装路径

    怎么查看python的pip install xx安装的软件的安装路径? pip freeze命令可以查看用pip安装的软件有哪些 要查看安装路径,在执行一次命令pip install xx,就会告诉 ...

  2. transform与position:fixed的那些恩怨

    1. 前言 在写这篇文章之前,我理解的fixed元素是这样的:(摘自CSS布局基础) 固定定位与absolute定位类型类似,但它的相对移动的坐标是视图(屏幕内的网页窗口)本身.由于视图本身是固定的, ...

  3. LeetCode OJ--Word Search **

    https://oj.leetcode.com/problems/word-search/ 类似于在棋盘上走步,走过的地方不能再走,每次都可以走当前位置的上.下.左.右,问能不能走出要求的形状来. 深 ...

  4. LeetCode OJ--Linked List Cycle **

    https://oj.leetcode.com/problems/linked-list-cycle/ 判断一个链表是否为循环链表(这个链表可能是 1 2 3 4 然后4指向2) 巧妙的方法:设置两个 ...

  5. 从壹开始 [ Ids4实战 ] 之四 ║ 用户数据管理 & 前后端授权联调

    前言 哈喽~~~ 大家周一好!夏天到了,大家舒服了没有,熟话说,打败你的不是天真,是天真热!

  6. POJ 1239 Increasing Sequences [DP]

    题意:略. 思路:进行两次dp. 第一次dp从前向后,用dp[x]表示从第x位向前dp[x]位可构成一个数字,且与前面的数组符合题意要求.最后求的dp[n]即为最后一个数字的长度. 而题目还有要求,所 ...

  7. JSP高级功能-java之JSP学习第三天(非原创)

    文章大纲 一.JSP 标准标签库(JSTL)二.JSP 连接数据库三.JSP XML 数据处理四.JSP JavaBean五.JSP 自定义标签六.JSP 表达式语言七.JSP 异常处理八.JSP 调 ...

  8. Springboot如何优雅的解决ajax+自定义headers的跨域请求

    1.什么是跨域 由于浏览器同源策略(同源策略,它是由Netscape提出的一个著名的安全策略.现在所有支持JavaScript 的浏览器都会使用这个策略.所谓同源是指,域名,协议,端口相同.),凡是发 ...

  9. ORACLE SQL*PLUS环境变量设置及说明

    1:查看当前用户的环境设置: SQL> define DEFINE _DATE " (CHAR) DEFINE _CONNECT_IDENTIFIER = "updb&quo ...

  10. RecyclerView的滚动事件分析

    列表的滚动一般分为两种: 手指按下 -> 手指拖拽列表移动 -> 手指停止拖拽 -> 抬起手指 手指按下 -> 手指快速拖拽后抬起手指 -> 列表继续滚动 -> 停 ...