跟哥一起学python(3)- 理解“变量”
我们把前面的程序稍微改一下,来了解python中的变量。
# file: ./4/4_1.py
# 定义变量
hello_str = "hello, world!"
# 字符串打印
print(hello_str)
建议通过视频来学习本节内容: 查看本节视频
这段代码实现的功能也是在终端打印出“hello,world!”这一字符串。与我们最开始那个程序不同的是,它定义了一个变量“hello_str”用于存储这个字符串,然后再调用print函数输出。
本节我们来学习什么是变量? 变量,顾名思义就是可以变化的一个数据,与其对应的不能改变的数据,叫做“常量”。
变量和常量,是所有编程语言的一个基本概念。
Python里面没有专门定义常量的语法,通常用变量来替代,所以我们不专门介绍常量。
抽象了看,所有的程序,无论大小,其本质都是在操作一系列的数据按照我们预设的逻辑去运算。这些数据在运算过程中,会被临时存储在内存中,我们可以认为变量就是对这些存储空间的一个命名。我们可以在代码中通过使用变量,来达到操作对应数据的目的,而不需要感知这个数据具体是怎么被计算机存储的。
我们通过pycharm来调试该段代码,看看变量是如何存储数据的:

我们通过id(hello_str)来获取变量hello_str的地址,这个地址是我们看来很奇怪的一串值。其实这个值是一个内存地址,它指向的是一段内存空间的起始位置。“hello,world!”这一串字符就存储在这段内存空间中。 变量的存储空间是堆(heap)和栈(stack)。堆栈是有很大区别的,在C语言里面你需要非常清晰的搞清楚它们,但是python封装得更好,不需要太去深究它们。如果感兴趣,你可以参考下图,或者百度。

总结一下,变量是用来临时存储数据的,它本质上指向的是一段存储空间的起始地址。 Python里面,对于变量的命名有一些约束,如下:
- 变量的第一个字符必须是字母表中字母或下划线 _ 。
- 变量的其他的部分由字母、数字和下划线组成。
- 标识符对大小写敏感。
- 变量不能采用python的保留字命名。
我们可以在windows命令行中采用下面的方法查询保留字:

理论上,python3可以支持采用中文字符命名变量。
下面我们通过一个有意思的例子来进一步深入理解python的变量。
# file: ./4/4_2.py score1 = 10score2 = 50 # score1 score2的地址
print('id(score1): %x, id(score2): %x, ' % (id(score1), id(score2)))
score2 = score2 - score1 # 字符串打印
print('score2: ', score2) # score1 score2的地址
print('id(score1): %x, id(score2): %x, ' % (id(score1), id(score2)))
score3 = 40
print('id(score3): %x' % (id(score3)))
这个例子的输出如下:
id(score1): 7ffc5331d7c0, id(score2): 7ffc5331dcc0,
score2: 40
id(score1): 7ffc5331d7c0, id(score2): 7ffc5331db80,
id(score3): 7ffc5331db80
我们可以看到,在score2的值变为40之后,它指向了一个新的地址7ffc5331db80。而我们定义了一个新变量score3,给它赋值40,它居然也和score2指向了同一块地址空间。写惯了C语言的程序员对此会感到费解,但python就是这样的。
当我们给score1赋值为10时,python会先给10创建一个对象并分配一个存储空间,然后再将score1指向这个对象。
当score2做减法后,python也会先给40分配一个对象空间,然后将score2指向这个新的对象,所以我们看到score2的地址变了。
当我们给score3赋值为40时,由于40对应的对象存在,所以直接将score3指向了这个对象。所以我们看到score2和score3的地址相同。
如下图所示:

那么原来那个值为50的对象怎么处理呢?如果是C语言,需要程序员主动去将其释放,否则就会内存泄露。幸运的是,python为我们提供了自动垃圾回收机制(GC),当它发现这个对象没有被引用后会自动将其释放。关于垃圾回收机制,这是一个很大的话题,我们现在没必要去深究它,有兴趣的同学可以百度。
我们再来看一个有意思的例子:
# file: ./4/4_3.py score1 = 10 score2 = score1
score1 = 20 print('score1: ', score1)
print('score2: ', score2)
它的输出是:
score1: 20
score2: 10
没有编程经验的同学会对此感到疑惑,不是score2=score1吗,为什么score1改变了,score2却没有改变?我们同样可以把变量的地址打印出来,就很好理解了。
# file: ./4/4_3.py score1 = 10
print('id(score1): %x' % (id(score1))) score2 = score1
print('id(score2): %x' % (id(score2))) score1 = 20
print('id(score1): %x, id(score2): %x, ' % (id(score1), id(score2))) print('score1: ', score1)
print('score2: ', score2)
它的输出是:
id(score1): 7ffc5331d7c0
id(score2): 7ffc5331d7c0
id(score1): 7ffc5331d900, id(score2): 7ffc5331d7c0,
score1: 20
score2: 10
我们可以看到,在score2 = score1后,score2的确指向了score1的地址。但是我们改变score1的值为20后,score1指向了另外一块地址空间,而score2并没有跟着改变,所以score2依然是10。
如下图所示:

我们最后再看一个例子,这个例子里面我们给变量赋了一个列表数据结构的值,关于数据结构,我们下一节会详细介绍,大家不用太关注。我们看看对于列表结构,它的变量是否也如同上面两个例子那样。
# file: ./4/4_4.py # 列表
num_list1 = [10, 20, 30, 40]
num_list2 = [10, 20, 30, 40] print('id(num_list1): %x, id(num_list2): %x' % (id(num_list1), id(num_list2))) num_list1[0] = 50
print('num_list1: ', num_list1) print('id(num_list1): %x, id(num_list2): %x' % (id(num_list1), id(num_list2)))
它的输出是:
id(num_list1): 292bd87df00, id(num_list2):
292bd9ba880num_list1:
[50, 20, 30, 40]id(num_list1): 292bd87df00, id(num_list2):
292bd9ba880
可以看出,在初始赋值时,虽然num_list1和num_list2的值是相同的,但是它们指向的地址空间并不相同。我们修改了num_list1的值之后,num_list1也并没有重新指向一个新的地址。所以,列表数据类型和我们上面两个例子中的变量处理是不一样的。Python会给列表对应的变量分配独立的地址空间,即便值相同,也不会多个变量复用。

对于不同数据类型的变量,python的处理方式是不一样的。也许你现在会觉得有点乱,没关系,下节我们学习了python的数据类型之后,你就能理解python的解释器为什么要这样区别处理了。
另外,从这些例子我们也能理解变量给我们带来的好处了,试想如果没有变量的话,程序员几乎没法写代码,因为你想要的那个数据一会儿存在A地址,一会儿又存在了B地址。但是有了变量的话,程序员只需要对这个变量进行操作即可,不需要关心它具体指向哪儿。
好了,下节我们学习python的数据类型。
跟哥一起学python(3)- 理解“变量”的更多相关文章
- 跟哥一起学python(2)- 运行第一个python程序&环境搭建
本节的任务,是完成我们的第一个python程序,并搭建好学习python的环境. 建议通过视频来学习本节内容: 查看本节视频 再次看看上一节提到的那张图,看看作为高级编程语言,我们如何编程. 首先, ...
- 跟哥一起学Python(1) - python简介
01—写在前面 我做了十几年的程序猿,码过代码.带过项目.做过产品经理.做过软件架构师.因为我是做通信设备软件的,面向底层操作系统,所以我的工作主要以C语言为主.Python在我的工作中通常用来写一些 ...
- <python 深入理解>变量交换x,y=y,x实现机制--元组
python中有一种赋值机制即多元赋值,采用这种方式赋值时,等号两边的对象都是元组并且元组的小括号是可选的.通常形式为 x, y, z = 1, 2, 'a string' 等同于 (x, y, z) ...
- 跟哥一起学python(4)- 数据类型之Number
本节我们开始学习python的数据类型. 什么是数据类型呢?前面我们提过,所谓的编程,就是控制一系列的数据去完成我们预设的逻辑或者功能.所以,编程语言首先要定义一系列对“数据”的处理规则.这些处理规则 ...
- C++程序员学Python
目录 C++程序员学Python 第二章.变量和数据类型 1.注释语句前用#: 2.常用于大小写函数: 第三章.列表 1.列表简述 2.修改,增加,插入,删除列表元素 第四章操作列表 1.遍历 2.创 ...
- 小白学 Python(4):变量基础操作
人生苦短,我选Python 引言 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 前面的文章中,我们介绍了 ...
- Python 中的变量还能这样理解(白话)
一.案例分析 1.思考 计算软件测试大佬柠檬小姐姐,每月能存多少钱 # 计算软件测试大佬柠檬小姐姐,每月能存多少钱 # 坐标:深圳 # 2018年1月份 # 房租水电 4000元 # 伙食费 1000 ...
- 【Python五篇慢慢弹】快速上手学python
快速上手学python 作者:白宁超 2016年10月4日19:59:39 摘要:python语言俨然不算新技术,七八年前甚至更早已有很多人研习,只是没有现在流行罢了.之所以当下如此盛行,我想肯定是多 ...
- 简学Python第二章__巧学数据结构文件操作
#cnblogs_post_body h2 { background: linear-gradient(to bottom, #18c0ff 0%,#0c7eff 100%); color: #fff ...
随机推荐
- Python之 module安装
如出现这种错误 ModuleNotFoundError: No module named 'numpy' 这种错误通常不会出现,因为Python的模块,通常在你安装Python shell的时候,就已 ...
- tf.nn.sigmoid_cross_entropy_with_logits 分类
tf.nn.sigmoid_cross_entropy_with_logits(_sentinel=None,,labels=None,logits=None,name=None) logits和la ...
- Error: opening registry key 'Software\JavaSoft\Java Runtime Environment' could not find java.dll
Error: opening registry key 'Software\JavaSoft\Java Runtime Environment'Error: could not find java.d ...
- 5分钟python爬虫案例,手把手教爬取国内外最新疫情历史数据
俗话说的好,“授之以鱼不如授之以渔”,所以小编今天就把爬疫情历史数据的方法分享给你们. 基本思路:分析腾讯新闻“抗肺炎”版块,采用“倒推法”找到疫情数据接口,然后用python模拟请求,进而保存疫情历 ...
- python在办公时能给我们带来什么?
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:谦睿科技教育 PS:如有需要Python学习资料的小伙伴可以加点击下方 ...
- Hash记录字符串
Hash记录字符串模板: mod常常取1e9+7,base常常取299,,127等等等....有的题目会卡Hash,因为可能会有两个不同的Hash但却有相通的Hash值...这个时候可以用双Hash来 ...
- Linux学习笔记(五)搜索命令
搜索命令 whereis which locate find whereis 英文原意:locate the binary,source,and manual page files for a com ...
- SpringBoot集成MyBatis底层原理及简易实现
MyBatis是可以说是目前最主流的Spring持久层框架了,本文主要探讨SpringBoot集成MyBatis的底层原理.完整代码可移步Github. 如何使用MyBatis 一般情况下,我们在Sp ...
- XSS语义分析的阶段性总结(二)
本文首发于“合天智汇”微信公众号,作者:Kale 前言 上次分享了javascript语义分析,并且简单介绍了新型xss扫描器的一些想法,如何在不进行大量fuzz的情况下又能准确的检测出xss漏洞,这 ...
- 全网最全最细的appium自动化测试环境搭建教程以及appium工作原理
一.前言 对于appium自动化测试环境的搭建我相信90%的自学者都是在痛苦中挣扎,在挣扎中放弃,在放弃后又重新开始,只有10%的人,人品比较好,能够很快并顺利的搭建成功.appium 自动化测试 ...