Python基础语法-常量与变量
Python是一门强类型的动态语言。
字面常量,变量没有类型,变量只是在特定的时间指向特定的对象而已,变量所指向的对象是有类型的。
变量:变量在赋值时被创建,它可以是任何对象的引用,但必须在引用前被赋值。
举例来说:当我们如下赋值时:
>>> a = 3 # 给一个对象3赋予变量a
对于上面的赋值,Python将会明确的执行3个步骤来响应这个语句:
- 创建一个对象代表值3;
- 如果不存在变量a,就创建变量a;
- 把变量a与新创建的对象3关联。
变量随着赋值操作出现的。变量和对象是被存储在不同的内存空间中的。变量与对象通过指针相关联。变量永远指向对象且永不指向变量。随着赋值a = 3
语句的执行,变量a就变成了对象3的一个引用。
变量与对象之间的链接在Python中称之为引用。也就是说,一个引用也就是一种关联,在内存中以指针的形式实现。
变量、对象与引用的区别:+ 变量 是Python解释器系统表中的一些条目, 它们是用来指向对象的。+ 对象 是一些列的被分配的内存, 有足够的空间存储与之相关的数据类型。+ 引用 自动地跟随在变量与对象之间。
对象才有类型, 而变量没有。一个例子:
>>> a = 3 # a是一个整型数据
>>> a = 'spam' # 现在是一个字符串了
>>> a = 1.23 # 现在是一个浮点数了
在Python中,事情工作的很简单,再次强调:Names没有类型;只有对象有类型,而不是变量。
变量的命名规则:
- 只能包含字母、数字和下划线
- 只能以字母或下划线开头
- 不能是Python解释器的保留字
共享引用
接下来我们看两个变量同时指向一个对象的情况:
>>> a = 3
>>> b = a
赋值完毕,它们在内存中的图解为:
现在,假设我们再进行如下的赋值语句:
>>> a = 3
>>> b = a
>>> a = 'spam'
现在变量a指向的对象spam
。然而变量b却依然指向对象3。赋值意味着创建了新的对象。上面三句语句在内存中的图解为:
共享引用与原地改变
接下来要看的是有一些对象会进行原地改变,那就是Python的可变对象,包括列表,字典及集合。对于一个支持原地改变的对象,我们需要知道共享引用,如果一个改变会影响其他的对象。还是看个例子吧:
>>> L1 = [2, 3, 4]
>>> L2 = L1
L1是一个列表且包含2、3、4三个对象。列表中的元素通过它们的位置进行访问,所以L1[0]指向对象2,它是列表L1的第一个对象。当然列表也是一个对象,就像其他的整数与字符串。当进行上面的两个赋值后,L1与L2都指向了同一个共享的对象。
现在,我们进行如下的赋值:
>>> L1 = 24
这个赋值语句简单地把L1指向了不同的对象;L2依然指向原来的列表。接下来我们进行一些改变:
>>> L1 = [2, 3, 4] # 一个可变的对象
>>> L2 = L1 # L2与L1指向了同样的对象
>>> L1[0] = 24 # 一个原地改变的操作
>>> L1 # L1已经改变了
[24, 3, 4]
>>> L2 # L2也是与L1相同
[24, 3, 4]
上面的例子中,我们并没有改变L1对象本身,只是改变了L1中的一个对象。这种原地改变的操作的情况只出现在可变对象中。举个字典的例子:
>>> d1 = {'a': 1, 'b': 2}
>>> d2 = d1
>>> d1
{'b': 2, 'a': 1}
>>> d2
{'b': 2, 'a': 1}
>>> d1['a'] = 'a'
>>> d2
{'b': 2, 'a': 'a'}
我们可以使用copy的方法:
>>> L1 = [2, 3, 4]
>>> L2 = L1[:] # 制作L1的拷贝
>>> L1[0] = 24
>>> L1
[24, 3, 4]
>>> L2 # L2并没有改变
[2, 3, 4]
通过上面的例子我们发现,L1的改变并没有影响L2,L2只是引用了L1的一份拷贝,并不是原来的L1自身,也就说,L1与L2指向了两个不同的内存空间。
接下来谈论另外一个话题,Python会缓存小的整数及小的字符串。举个例子吧:
>>> L = [1, 2, 3]
>>> M = L # M与L指向相同的对象
>>> L == M # 具有相同的值
True
>>> L is M # 依然相同
True
>>> id(L)
4338913608
>>> id(M)
4338913608
通过上面的例子,==
判断两个引用的对象是否有相同的值;第二个操作符is
是用来判断对象id的,只有两个names指向相同的对象,is
比==
判断对象是否相同更强壮。is
只是简单地比较两个对象的指针。再看一个例子:
>>> L = [1, 2, 3]
>>> M = [1, 2, 3] # M与L指向不同的对象(赋值意味着产生新的对象)
>>> L == M # 具有相同的值
True
>>> L is M # 但是是不同的对象
False
>>> id(L)
4338913480
>>> id(M)
4338915208
接下来呢,我们看看对于小数字的操作是否不符合上面的预期:
>>> X = 42
>>> Y = 42 # X与Y应该是两个不同的对象
>>> id(X)
4297547872
>>> id(Y)
4297547872
>>> X == Y
True
>>> X is Y # but anyhow: 是缓存在作祟!
True
# 使用个大的数字呢?
>>> X = 1234567
>>> Y = 1234567
>>> X == Y
True
>>> X is Y
False
>>> id(X)
4336930640
>>> id(Y)
4338529328
今天的文章中遇到了列表及字典,大家不用担心,现在大家不知道或不清楚怎么使用都是没有问题的,后续会继续有相应的文章呈现。
- Oracle数据库冷备份与热备份操作梳理
- Oracle数据库重做日志及归档日志的工作原理说明
- 用vs.net2010做flex/flash/as3开发
- python中input()与raw_input()的区别到底是啥?
- VB下中文URL编码问题的解决
- 让ZeGraph在X方向上填满
- 中国区块链技术和产业发展论坛举行——区块链应用发展尚需时日
- silverlight获取外部数据的另一种选择:FluorineFx
- 存储状态数据
- Oracle数据库设置为归档模式的操作方法
- flash/flex 与 FluorineFx通讯之Hello World!
- 苹果CEO首次泄露出自动驾驶汽车的相关战略信息
- Linux下绑定网卡的操作记录
- flash开发中如何实现界面代码分离
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 拜托!这才是分布式系统CAP的正确打开方式!
- 接口管理这下总会了吧?
- 交子杯 - 2020 - AI赛道 - TOP1
- Valine 一款快速、简洁且高效的无后端评论系统
- 两段有趣的C代码
- 算法数据结构 | 三个步骤完成强连通分量分解的Kosaraju算法
- 并查集算法 详解
- SQL 中 EXISTS 用法详解
- Blazor带我重玩前端(六)
- PB 级大规模 Elasticsearch 集群运维与调优实践
- MySQL实时在线备份恢复方案
- Android通过原生请求直接获取网页内容
- matplotlib | Python强大的作图工具,让你从此驾驭图表(二)
- 设计模式 | Catalog设计模式,抵御业务方需求变动
- 【Flutter 专题】99 初识 EventBus