Python基础---变量

系统 1402 0

Python基础---变量

什么是变量:

用来绑定数据对象的标识符

一.变量的命名规则:

  • 变量名必须为字母或下划线开头,后跟字母或下划线或数字
  • 不能使用python的关键字命名
  • 命名规则可以被视为一种 惯例,并无绝对与强制
  • 目的是为了   增加代码的识别和可读性
  • 在定义变量时,为了保证代码格式,= 的左右应该各保留一个空格
  • 在Python中,如果变量名需要由 二个 或 多个单词 组成时,可以按照以下方式命名
  1. 每个单词都使用小写字母
  2. 单词与单词之间使用 _下划线 连接
  3. 例如:first_name、ast_name、qq_number、qq_password
  • 当 变量名是由二个或多个单词组成时,还可以利用驼峰命名法来命名
  1. 小驼峰式命名法:第一个单词以小写字母开始,后续单词的首字母大写。例如:firstName、lastName
  2. 大驼峰式命名法:每一个单词的首字母都采用大写字母。例如:FirstName、LastName、CamelCase
                
                  #
                
                
                  合法的变量命名示例:
                
                
                  
a   a1  b  bbb  _aaa_ _Abcdvara1b2c2


                
                
                  #
                
                
                  不合法的变量命名示例:
                
                
                  
1a  
                
                123  $ABC +a -b  
                
                  #
                
                
                  ab @ab
                
              

关键字:

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

查看关键字:

                
                  import
                
                
                   keyword

                
                
                  print
                
                
                  (keyword.kwlist)

                
                
                  #
                
                
                  ['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
                
              

二.变量的赋值:

赋值语法:

                变量名=
                
                  表达式

变量名1
                
                =变量名2=
                
                  表达式

变量名1,变量名2,...
                
                =
                
                  序列

变量名1,变量名2,...
                
                =
                
                  对象1,对象2...

变量名1,变量名2,...
                
                =
                
                  [对象1,对象2...]

变量名1,变量名2,...
                
                =(对象1,对象2...)
              

作用: 用于创建变量并将变量绑定(或关联)在一个对象上

说明:

  • 当变量不存在时,创建该变量同时绑定在这个对象上
  • 当变量存在时,改变此变量的绑定的对象
  • 一个变量只能绑定一个对象
  • 两个变量可以同时绑定一个对象

示例:

                a=10      
                
                  #
                
                
                  创建a变量,和整型对象10绑定在一起
                
                
                  
b
                
                =20
                
                  

c
                
                =a+b   
                
                  #
                
                
                  创建变量c,和10+20的计算结果绑定在一起
                
              

名词解释:

关联/绑定/引用在python中的含义,变量是没有类型的,关联/绑定/引用都是指变量和一个对象的关联关系

可以通过help('__main__')来查看当前模块下的数据关联关系

三.python的自动化内存管理:

python 的内存管理和引用计数

每个对象都会记录有几个变量引用自身,当引用的数量为0时,则对象被销毁,此种自动化内存管理的方式叫引用计数。

                a = 10000
                
                  
b 
                
                = 20000
                
                  

a 
                
                = a + b 
                
                  #
                
                
                   发生了什么?
                
                
c = a 
                
                  #
                
                
                   发生了什么?
                
                
                  #
                
                
                  a = 10000 内存中创建一个10000对象,用变量a和10000绑定绑定
                
                
                  
#
                
                
                  b = 20000 内存中创建一个 20000对象,用变量b和20000对象绑
                
                
                  
#
                
                
                  a = a + b 计算对象a 和 b 的和,创建一个30000的对象,a 解除与10000对象的绑定,重新绑定30000这个对象
                
                
                  #
                
                
                  c = a 变量c和变量a绑定同一个对象
                
              

变量的交换绑定

                
                  #
                
                
                  练习:已知有两个变量:a 绑定 10000 b 绑定 20000
                
                
                  
#
                
                
                  问:在不创建任何新的对象的情况下,如何让a和b 交换绑定的对象?
                
                
                  
#
                
                
                  方法1:
                
                
a = 10000
                
                  
b 
                
                = 20000
                
                  
temp 
                
                = a 
                
                  #
                
                
                  借助第三个变量,经典交换算法
                
                
a =
                
                   b
b 
                
                =
                
                   temp


                
                
                  #
                
                
                  方法2:序列赋值 
                
                
a, b = b , a
              

四.变量的is与==

  • is 比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同。莱布尼茨说过:“世界上没有两片完全相同的叶子”,这个is正是这样的比较,比较是不是同一片叶子(即比较的id是否相同,这id类似于人的身份证标识)。
  • == 比较的是两个对象的内容是否相等,即内存地址可以不一样,内容一样就可以了。这里比较的并非是同一片叶子,可能叶子的种类或者脉络相同就可以了。默认会调用对象的 __eq__()方法。

获取对象的内存地址: id 函数
格式: id(对象)
作用: 返回一个对象在内存中的地址

可以通过如下例子来区分比较下:

                >>> a = [
                
                  "
                
                
                  I
                
                
                  "
                
                , 
                
                  "
                
                
                  love
                
                
                  "
                
                , 
                
                  "
                
                
                  Python
                
                
                  "
                
                
                  ]

                
                >>> b =
                
                   a

                
                
                  #
                
                
                   a的引用复制给b,在内存中其实是指向了用一个对象
                
                
>>> b 
                
                  is
                
                
                   a
True

                
                >>>
                
                   id(a)

                
                46381384
>>>
                
                   id(b)

                
                46381384

                
                  #
                
                
                   当然,内容也肯定是相等的
                
                
>>> b ==
                
                   a
True
                
              

可以发现b和a的内存地址是相同的,它们指向同一块内存,因而 is 和 == 的结果都为True。这是因为直接赋值都是赋值的引用,是引用,是引用,重要的事情说三遍。

但如果不是通过引用赋值,而是通过切片赋值呢?

                
                  #
                
                
                   b通过切片操作重新分配了对象,但是值和a相同
                
                
>>> b =
                
                   a[:]

                
                >>> b 
                
                  is
                
                
                   a
False

                
                >>>
                
                   id(a)

                
                48740680
>>>
                
                   id(b)

                
                48740680
>>> b == a 
                
                  #
                
                
                   但他们的值还是相等的
                
                
True
              

新建对象之后,b 和 a 指向了不同的内存,所以 b is a 的结果为False,而 b==a的结果为True。

在这里,小编提一个问题,b[0] is a[0] 的结果呢?

答案是True。

因为切片拷贝是浅拷贝,列表中的元素并未重新创建。

通常,我们关注的是值,而不是内存地址,因此 Python 代码中 == 出现的频率比 is 高。

但是什么时候用 is 呢?

is 与 == 相比有一个比较大的优势,就是计算速度快,因为它不能重载,不用进行特殊的函数调用,少了函数调用的开销而直接比较两个整数 id。而 a == b 则是等同于a.__eq__(b)。继承自 object 的 __eq__ 方法比较两个对象的id,结果与 is 一样。但是多数Python的对象会覆盖object的   __eq__方法,而定义内容的相关比较,所以比较的是对象属性的值。

在变量和单例值之间比较时,应该使用 is。

目前,最常使用 is 的地方是判断对象是不是 None。

下面是推荐的写法:

                a 
                
                  is
                
                 None
              

判断不是None的推荐写法是:

                a 
                
                  is
                
                
                  not
                
                 None
              

Python会对比较小的整数对象进行缓存,下次用的时候直接从缓存中获取,所以is 和 == 的结果可能相同:

                >>> a = 1
>>> b = 1
>>> a 
                
                  is
                
                
                   b
True

                
                >>> a ==
                
                   b
True
                
              

而看一下另外一段代码:

                >>> a = 257
>>> b = 257
>>> a 
                
                  is
                
                
                   b
False
                
              

原因:

Python仅仅对比较小的整数对象进行缓存(范围为范围[-5, 256])缓存起来,而并非是所有整数对象。需要注意的是,这仅仅是在命令行中执行,而在Pycharm或者保存为文件执行,结果是不一样的,这是因为解释器做了一部分优化。

总结

  • is 比较两个对象的 id 值是否相等,是否指向同一个内存地址;
  • == 比较的是两个对象的内容是否相等,值是否相等;
  • 小整数对象[-5,256]在全局解释器范围内被放入缓存供重复使用;
  • is 运算符比 == 效率高,在变量和None进行比较时,应该使用 is。

五.变量的删除

del 语句(del 是 delete 的简写)
作用: 用于删除变量,同时删除与对象的绑定关系。如果可能则释放对象
语法: del 变量名


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论