Python基础知识之变量的详解


Posted in Python onApril 14, 2021

一.定义

在python中,变量名只有在第一次出现的时候,才是定义变量。当再次出现时,不是定义变量,而是直接调用之前定义的变量。

二.命名方法

2.1小驼峰命名法

第一个单词以小写字母开始,后续单词的首字母大写

firstName , lastName

2.2大驼峰命名法

每一个单词的首字母都采用大写字母
FirstName , LastName

2.3下划线命名法

每个单词之间用下划线连接起来
first_name , last_name

三.命名规则

3.1标识符

开发人员自定义的一些符号和名称
如:变量名、函数名、类名

标识符命名规则
1.只能由数字、字母、下划线组成,且不能以数字开头
2.不能和python中的关键字重名
3.尽量做到见名知义
4.不能使用单字符(i,o)作为变量名,因为太像0和1了
5.函数首字母小写,类的首字母大写

3.2关键字

1.关键字就是在python内部已经使用的标识符
2.关键字具有特殊的功能和含义
3.开发者不允许定义和关键字相同的名字的标识符

注意:

1.命名规则可以被视为一种惯例,无绝对与强制,目的是为了增加代码的识别和可读性
2.python中的标识符是区分大小写的
3.在定义变量时,为了保证代码格式,遵循PEP8规范,等号(=)的左右两边该各保留一个空格

四.使用方法

4.1单变量赋值:

变量名 = 值
例:a = 1
在python中赋值语句总是建立对象的引用值,而不是复制对象。因此,python中的变量存储的是引用数据的内存地址,而不是数据存储区域。


Python基础知识之变量的详解

当涉及多个变量时:

a = 1
b = a
c = b
print(a) # 1
print(id(a)) # 140710098927888
print(b) # 1
print(id(b)) # 140710098927888
print(c) # 1
print(id(c)) # 140710098927888

a、b、c三个变量的值都等于1,即使在最初定义变量的时候b和c不是直接等于1的,但是他们仍然存储着指向“1”的内存地址。

4.2底层逻辑:

Python基础知识之变量的详解

4.3总结:

可以说Python中没有赋值,只有引用。Python 没有“变量”,我们平时所说的变量其实只是“标签”,是引用。

当创建了无数个变量=1时,在内存中,只会开辟无数个空间存储变量,再开辟一个空间存储“1”,而这些变量中存储的内存地址都相同,全都指向“1”的内存地址。

在代码层面,看起来像是给变量赋值,但是在底层却是变量指向值,也就是变量引用了值。

相信大家还有疑问,那么请继续阅读

5.变量进阶

先提出一个问题:

a = [0, 1, 2]
a[1] = a
print(a)

猜想结果是:

[0, [0, 1, 2], 2]

但是真正的结果是:

[0, [...], 2]

为什么结果会赋值了无限次??

结合刚才得出的结论:Python中没有赋值,只有引用。

真相是:
这样相当于创建了一个引用自身的结构,所以导致了无限循环。

通过递归函数可能更好理解:

a = [0,1,2]
a[1] = a

def fun1(n1):
    for i in n1:
        if type(i) == list:
            return fun1(n1)
        else:
            print(i)

print(fun1(a[1]))

结果:

Python基础知识之变量的详解

果然是:调用Python对象时超出最大递归深度。

底层逻辑:a[1] = a 造成了递归引用

Python基础知识之变量的详解

当调用变量a时,就是调用[0,1,2],此时 [0,1,2] 的结构变成了 [0,?,2] ,而 ? 又指向 [0,?,2] 本身,以此类推,造成了递归调用的情况。
所以在遍历a并输出的时候会引起超出最大递归深度的错误。

想得到 [0, [0, 1, 2], 2] 的结果并不难:

a = [0,1,2]
a[1] = a[:]
print(a) # [0, [0, 1, 2], 2]

a[:] = a[0:尾部索引值:1]
生成对象的浅拷贝或者是复制序列,不再是引用和共享变量,但此法只能顶层复制

6. a = a + 1 和 a += 1 的区别

既然谈到了赋值和引用的区别,那就捎带谈一下a = a + 1 和 a += 1 的区别:
直接上代码:

a = [1, 2]
b = a
print(id(a)) # 1878561149448
print(id(b)) # 1878561149448
a = a + [1, 2]
print(a, b) # [1, 2, 1, 2] [1, 2]
print(id(a)) # 1878593529288
print(id(b)) # 1878561149448
print ("-------------------")
a = [1, 2]
b = a
print(id(a)) # 1878561149960
print(id(b)) # 1878561149960
a += [1, 2]
print(a, b) # [1, 2, 1, 2] [1, 2, 1, 2]
print(id(a)) # 1878561149960
print(id(b)) # 1878561149960

通过对比发现问题:变量a通过“=” 和 “+=”运算,得到的变量b竟然是不同的,运算后变量a的id竟然也是不同的。
执行a = a + [1, 2] 后:
变量b指向的值并未发生改变,而变量a的id发生了变化,值也发生了变化
执行a += [1, 2] 后:
变量a和b的值都发生了改变,而二者的id却没有改变

具体原因,看图说话:
执行a = a + [1, 2] 后,会生成一个新对象,并在cpu上开辟一块空间存储 a + [1, 2] ,然后由a指向它。所以变量a的id发生了变化,值也发生了变化。此时变量b指向的值并未发生改变。


Python基础知识之变量的详解

执行a += [1, 2] 后:并不会生成新对象,只是把a原本指向内存地址的对象的值改变成了 a + [1, 2],所以变量a和b的值都发生了改变,而二者的id却没有改变。


Python基础知识之变量的详解

对于可变对象类型和不可变对象类型有不同的结果:

可变对象类型:+=改变了原本地址上对象的值,不改变原本的指向地址;=则改变了原本的指向地址,创建了新的对象,并指向新的地址

不可改变对象类型:都是改变原本的指向地址,指向新创建的对象地址

a = 'abc'
b = a
print(id(a)) # 1629835782384
print(id(b)) # 1629835782384
a = a + 'd'
print(a, b) # abcd abc
print(id(a)) # 1629835853168
print(id(b)) # 1629835782384
print ("-------------------")
a = 'abc'
b = a
print(id(a)) # 1629835782384
print(id(b)) # 1629835782384
a += 'd'
print(a, b) # abcd abc
print(id(a)) # 1629835782384
print(id(b)) # 1629835782384

到此这篇关于Python基础知识之变量的详解的文章就介绍到这了,更多相关python变量详解内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python BeautifulSoup中文乱码问题的2种解决方法
Apr 22 Python
使用相同的Apache实例来运行Django和Media文件
Jul 22 Python
在Linux系统上部署Apache+Python+Django+MySQL环境
Dec 24 Python
全面了解Python的getattr(),setattr(),delattr(),hasattr()
Jun 14 Python
python构建自定义回调函数详解
Jun 20 Python
python中学习K-Means和图片压缩
Nov 20 Python
解决python通过cx_Oracle模块连接Oracle乱码的问题
Oct 18 Python
浅析python的Lambda表达式
Feb 27 Python
Python3将数据保存为txt文件的方法
Sep 12 Python
解决Python命令行下退格,删除,方向键乱码(亲测有效)
Jan 16 Python
解决matplotlib.pyplot在Jupyter notebook中不显示图像问题
Apr 22 Python
如何利用Python动态模拟太阳系运转
Sep 04 Python
理解深度学习之深度学习简介
Apr 14 #Python
python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析
深度学习小工程练习之垃圾分类详解
python3美化表格数据输出结果的实现代码
Apr 14 #Python
Python生成九宫格图片的示例代码
用Python写一个简易版弹球游戏
python urllib库的使用详解
Apr 13 #Python
You might like
php 无限级分类学习参考之对ecshop无限级分类的解析 带详细注释
2010/03/23 PHP
PHP中获取文件创建日期、修改日期、访问时间的方法
2016/11/05 PHP
Laravel 框架路由原理与路由访问实例分析
2020/04/14 PHP
关于Blog顶部的滚动导航条代码
2006/09/25 Javascript
控制打印时页眉角的代码
2007/02/08 Javascript
jQuery-Easyui 1.2 实现多层菜单效果的代码
2012/01/13 Javascript
JQuery 在线引用及测试引用是否成功
2014/06/24 Javascript
jquery+ajax验证不通过也提交表单问题处理
2014/12/12 Javascript
深入理解JavaScript系列(41):设计模式之模板方法详解
2015/03/04 Javascript
jQuery实现可展开合拢的手风琴面板菜单
2015/09/15 Javascript
javascript检测移动设备横竖屏
2016/05/21 Javascript
Javascript之Math对象详解
2016/06/07 Javascript
基于JS实现弹出一个隐藏的div窗口body页面变成灰色并且不可被编辑
2016/12/14 Javascript
jQuery图片拖动组件Dropzone用法示例
2017/01/17 Javascript
vue做移动端适配最佳解决方案(亲测有效)
2018/09/04 Javascript
微信小程序按顺序同步执行的两种方式
2019/12/20 Javascript
[10:07]2014DOTA2国际邀请赛 实拍选手现场观战DK对阵Titan
2014/07/12 DOTA
[47:12]TFT vs Secret Supermajor小组赛C组 BO3 第三场 6.3
2018/06/04 DOTA
Python通过select实现异步IO的方法
2015/06/04 Python
Python django实现简单的邮件系统发送邮件功能
2017/07/14 Python
Python多线程爬虫实战_爬取糗事百科段子的实例
2017/12/15 Python
numpy.delete删除一列或多列的方法
2018/04/03 Python
在cmder下安装ipython以及环境的搭建
2018/10/19 Python
详解python tkinter教程-事件绑定
2019/03/28 Python
OpenCV+python实现实时目标检测功能
2020/06/24 Python
python的setattr函数实例用法
2020/12/16 Python
售后服务承诺书模板
2014/05/21 职场文书
2014年依法行政工作总结
2014/11/19 职场文书
2014年学校工作总结
2014/11/20 职场文书
2015年社区服务活动总结
2015/03/25 职场文书
大学军训口号大全
2015/12/24 职场文书
文明和谐家庭事迹材料(2016精选版)
2016/02/29 职场文书
电脑只能进入安全模式无法正常启动的解决办法
2022/04/08 数码科技
Windows Server 2012 修改远程默认端口3389的方法
2022/04/28 Servers
Redis keys命令的具体使用
2022/06/05 Redis
MySQL8.0 Undo Tablespace管理详解
2022/06/16 MySQL