Python中的变量赋值

 更新时间:2021年10月11日 11:27:14   作者:真的会了吗  
这篇文章主要介绍了Python中的变量赋值,Python中的变量在使用中很流畅,可以不关注类型,任意赋值,对于开发来说效率得到了提升,但不了解其中的机理,往往也会犯一些小错,让开发进行的不那么流畅,本文就从语言设计和底层原理的角度,带大家理解Python中的变量。

引言:

Python中的变量在使用中很流畅,可以不关注类型,任意赋值,对于开发来说效率得到了提升,但若不了解其中的机理,往往也会犯一些小错,让开发进行的不那么流畅,本文就是从语言设计和底层原理的角度,带大家理解Python中的变量。

下面我们从一个简单例子开始:

a = 3

当我们代码中写入a=3时到底发生了啥,从概念上来说,Python会执行三个不同的步骤来完成这个请求:

  • 创建了一个对象来代表值3
  • 若是a尚未创建会创建一个变量a
  • 将变量a和新的对象3进行关联,称变量a为对象3的一个引用

上文提到的三个关键字,“对象”、“变量”、“引用”是Python中让变量得以运作的关键,我们在下一小节细细道来。

1 变量、对象、引用

先从概念说起:

对象是分配的一块内存,有足够的空间去表示它们所代表的值。

变量是一个系统表的元素,拥有指向对象的连接的空间。

引用时自动形成的从变量到对象的指针。

接着上文中a=3的三个步骤,咱们增加一句代码:

a = 3
b = a

下面通过一张图表征了两句话执行的结果:

关于b=a引发的操作为b同样也指向了3,建立了从变量b到对象3的引用,此部分实现了python的赋值操作。此部分引出了Python中的赋值操作的秘密,下面咱们先来看一下为什么Python中变量赋值时不用指定变量的类型呢,实际上从上面的概念中已经发现了一个重要定义:

>>> 类型属于对象,而不是变量

为了理解对象类型是如何使用的,我们看一下对一个变量多次赋值的结果:

a = 3
a = 'wali'
a = 3.1415926

从表面上看,a开始是一个整数,接着变成一个字符串,最后变成一个浮点,对于学习过C语言的人来说,这个是无法理解的,但对于python来说,这是可以执行的。看起来像是a的类型在连续改变,实际上我们理解了变量、引用、对象的概念以及“类型属于对象,而不是变量”这些知识后,我们会发现,实际发生了如下的事情:

执行中分别创建了整数类型的对象3,字符串的对象“wali”以及浮点数的对象3.14,变量a并不拥有这些类型,只是简单的通过引用分别指向了三个对象。

进一步深入研究就会发现,从Python语言实现的角度来说,每个对象都包含了一个头部信息,其中就标识了这个对象的类型。

此外,还有一个概念“引用计数器”,我们再来看下,最开始的代码:

a = 3
b = a

可能聪明的读者已经心里默默计算出对于对象3的引用计数器的值为2,分别为变量a和变量b对对象3的引用。是的,引用计数器的定义就是这么明了,用于表征用于指向同一个对象的引用的个数。通过变量间的赋值操作,自动的计算对象的引用计数。

那么,我们又会问引用计数器有啥用呢,为啥要多此一举来计算有多少个变量引用同一个变量呢,此时我们引出一个新的概念:对象的垃圾回收。

2 对象的垃圾回收机制

有一段代码:

a = 3
a = 'wali'
a = 3.1415926

我们会进一步思考,当我把a从指向整数对象3改变为指向字符串对象‘wali'时,那对象3发生了啥 ?难道一直放在内存里,如果对象非常大,那岂不是很占用内存,实际上Python设计者早就为我们考虑的很周全了:

Python中,每当一个变量名被赋予了一个新的对象,之前的那个对象空间就会被回收(前提为此对象没有被其他的变量名或对象所引用),这种自动回收对象空间的技术叫做垃圾回收。

这里如何判断何时回收,就得用到上一节所说的一个非常重要的概念,对象引用计数器,当计数器值为0标识无变量或对象引用,自动回收对象空间。到此,我们明白了对象引用计数器的重要作用,也理解了,除了我们看到的代码,Python也在默默的为我们做不少自动化的事情。

3 变量所指向的对象不同会有何不同?

#example 1
a = 3
b = a
a = 5 

我们回到上面的例子中,如果a发生变化,那么b会跟着发生变化吗?理论上指向同一个对象是会跟着发生变化的,但是这里的答案是不会,因为对象3是数字,不可变对象,所以只能重新创建一个新的对象5,然后a指向对象5,但是如果a所指向的对象是一个可变的对象,比如说列表,就会和我们想的一样b也会跟着发生变化,如下面的例子所示:

#example 2
a = [1,2,3]
b = a
a[0] = 3


L = a is b 
>>>True
M  =  a == b
>>>True

那么看下面的例子,例子2 和例子3 有什么区别呢?

#example 3
a = [1,2,3]
b = [1,2,3]
L = a is b
>>>False
M  =  a == b
>>>True

python中有两种方法检测变量是否相等,is 和 == ,其中==是判断变量所指向的对象的值是否相等,is是判断对象的同一性,如果两个变量精确的指向同一对象,is操作符才会返回True,也可以理解为is操作符,是比较实现引用的指针是否相同,例子2中变量a和变量b指向同一个对象,所以L和M都是True,但是例子三中变量a和变量b指向不同的对象,所以才会出现例子3下面的L和M的值的不一样的情况~但是如果下面的例子又会出现不同的结果:

#example 4
a = 3
b = 3
L = a is b
>>>True
M  =  a == b
>>>True

#example 5
c = [1,2,3]
K = c[2] is a
>>>True

是为什么呢?因为3 为不可变对象,为了节省内存消耗,只会保留一份,不管有多少个引用指向对象3,对象3都只有一份,例子5也很好的证明了这一点~

例子4和例子5中变量和对象的引用关系

课外小知识:

(1)可变类型,值可以改变:主要包括list列表,dict字典;不可变类型,值不可以改变:主要包括:数值类型intlongboolfloat,字符串str,元组tuple

在例子3中变量a和b的所指向的对象为可变对象,并且a和b的地址不一样,但是a和b中的元素所指向的对象其实是一样的,如下图所示

到此这篇关于Python中的变量赋值的文章就介绍到这了,更多相关Python变量赋值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python OpenCV实现基于模板的图像拼接

    Python OpenCV实现基于模板的图像拼接

    基于特征点的图像拼接如果是多张图,每次计算变换矩阵,都有误差,最后可以图像拼完就变形很大,基于模板的方法可以很好的解决这一问题,本文就来和大家具体聊聊
    2022-10-10
  • python爬虫刷访问量 2019 7月

    python爬虫刷访问量 2019 7月

    这篇文章主要介绍了python爬虫刷访问量 2019 7月,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • Python数据传输黏包问题

    Python数据传输黏包问题

    这篇文章主要介绍了Python数据传输黏包问题,黏包指数据与数据之间没有明确的分界线,导致不能正确的读取数据,更多相关内容需要的小伙伴可以参考一下
    2022-04-04
  • Python手拉手教你爬取贝壳房源数据的实战教程

    Python手拉手教你爬取贝壳房源数据的实战教程

    随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容,了解python爬虫,本文给大家分享Python爬取贝壳房源数据的实战教程,感兴趣的朋友一起学习吧
    2021-05-05
  • python获取外网IP并发邮件的实现方法

    python获取外网IP并发邮件的实现方法

    下面小编就为大家带来一篇python获取外网IP并发邮件的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Python实现备份文件实例

    Python实现备份文件实例

    这篇文章主要介绍了Python实现备份文件的方法,可实现针对各类常见扩展名的文件进行备份的功能,需要的朋友可以参考下
    2014-09-09
  • Python二进制串转换为通用字符串的方法

    Python二进制串转换为通用字符串的方法

    今天小编就为大家分享一篇Python二进制串转换为通用字符串的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • 基于Python实现体育彩票选号器功能代码实例

    基于Python实现体育彩票选号器功能代码实例

    这篇文章主要介绍了基于Python实现体育彩票选号器功能代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • python如何提升爬虫效率

    python如何提升爬虫效率

    这篇文章主要介绍了python如何提升爬虫效率,帮助大家更好的理解和使用python 爬虫,感兴趣的朋友可以参考下
    2020-09-09
  • Python内存泄漏和内存溢出的解决方案

    Python内存泄漏和内存溢出的解决方案

    这篇文章主要介绍了Python内存泄漏和内存溢出的解决方案,帮助大家维护后台进程,感兴趣的朋友可以了解下
    2020-09-09

最新评论