Python中的变量赋值

目录
  • 1 变量、对象、引用
  • 2 对象的垃圾回收机制
  • 3 变量所指向的对象不同会有何不同?

引言:

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变量赋值内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python批量创建变量并赋值操作

    一,简单的情况: 核心是exec函数,exec函数可以执行我们输入的代码字符串.exec函数的简单例子: exec ('print "hello world"') hello world 可以很清晰的看到,我们给exec传入一个字符串'print "hello world"',exec是执行字符串里面的代码print "hello world".根据这个特性,我们可以用占位符实现我们对变量的定义,如: exec ("temp%s=1&q

  • python 实现循环定义、赋值多个变量的操作

    exec函数,可以循环定义.赋值多个变量 exec ("temp%s=1"%1) 这段代码的意思是,让exec执行temp1=1.字符串里面的%s由'1'代替了. 我们在外面再套一个循环就可以实现对多个变量的定义了. for i in range(10): exec ("temp%s=1"%i) 在这里,通过一个循环来生成10个变量,i的变化从0到9.用变量i替代%s,所以在每次循环里面,分别给temp0.temp1.temp2--赋值为1. 如果想要替换多个占位符

  • python模块中判断全局变量的赋值的实例讲解

    1.在模块中,我们需要判断__name__是否被赋值为"__main__". python fibo.py <arguments> 2.在脚本执行的情况下,模块的__name__属性将被赋值为__main__,这就是原因所在. $ python fibo.py 50 0 1 1 2 3 5 8 13 21 34 3.若以模块导入,则不会执行: >>> import fibo >>> 知识点扩展: Python动态声明变量赋值代码实例 通过

  • python中如何对多变量连续赋值

    看到一段代码,如下 self.batch_size = batch_size = 128 初一看很诧异,仔细想想其实很合理的. 在python可能会需要同时声明多个变量,并对多个变量赋予相同的初始值,可以采用如下的方式赋值 a=b=c=1 但这里也需要注意,如果赋值为列表或者字典,比如 a=b=c=[1,2,3] 则a.b.c都是指向列表的指针,而不是复制,改变一个,其它的也会改变. 比如令 a[1] = 4, 则 b=[1,4,3] python 赋值和拷贝 你真的了解吗? 现象:先上一段代码

  • Python之关于类变量的两种赋值区别详解

    我就废话不多说了,还是直接看代码吧! # -*- coding:utf-8 -*- #面试题,写一个方法,将一行字符串中所有的单词数量统计出来 class Person(object): TAG = "hello" p1 = Person() p2 = Person() print p1.TAG #第一种赋值方式 print p2.TAG print Person.TAG #第二种赋值方式 p1.TAG = "damn it" print p1.TAG print

  • Python中实现变量赋值传递时的引用和拷贝方法

    iamlaosong文 曾经看到这样一个问题,一个字典中的元素是列表,将这个列表元素赋值给一个变量,然后修改这个列表中元素的值,结果发现,字典中那个列表也同样修改了. 那个问题如下: dict = {'a':[1,2,3,4,5],'b':2} x = dict['a'] for i in range(5): x[i] = 0 print(dict['a']) 程序运行结果如下: [0, 0, 0, 0, 0] 这儿涉及到Python赋值到底是引用还是拷贝一份的问题,即赋值时是传值还是传址.上面

  • Python中的变量赋值

    目录 1 变量.对象.引用 2 对象的垃圾回收机制 3 变量所指向的对象不同会有何不同? 引言: Python中的变量在使用中很流畅,可以不关注类型,任意赋值,对于开发来说效率得到了提升,但若不了解其中的机理,往往也会犯一些小错,让开发进行的不那么流畅,本文就是从语言设计和底层原理的角度,带大家理解Python中的变量. 下面我们从一个简单例子开始: a = 3 当我们代码中写入a=3时到底发生了啥,从概念上来说,Python会执行三个不同的步骤来完成这个请求: 创建了一个对象来代表值3 若是a

  • 详细解析Python中的变量的数据类型

    变量是只不过保留的内存位置用来存储值.这意味着,当创建一个变量,那么它在内存中保留一些空间. 根据一个变量的数据类型,解释器分配内存,并决定如何可以被存储在所保留的内存中.因此,通过分配不同的数据类型的变量,你可以存储整数,小数或字符在这些变量中. 变量赋值: Python的变量不必显式地声明保留的存储器空间.当分配一个值给一个变量的声明将自动发生.等号(=)来赋值给变量. 操作数=操作符的左边是变量,操作数=操作符的右侧的名称在变量中存储的值.例如: #!/usr/bin/python cou

  • 解析Python中的变量、引用、拷贝和作用域的问题

    在Python中,变量是没有类型的,这和以往看到的大部分编辑语言都不一样.在使用变量的时候,不需要提前声明,只需要给这个变量赋值即可.但是,当用变量的时候,必须要给这个变量赋值:如果只写一个变量,而没有赋值,那么Python认为这个变量没有定义.如下: >>> a Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'a'

  • Python编程之变量赋值操作实例分析

    本文实例讲述了Python编程之变量赋值操作.分享给大家供大家参考,具体如下: #coding=utf8 ''''' Python中主要通过等号(=)进行赋值. Python中的赋值不是直接将一个值赋给一个变量, 而是将该对象的引用(并不是值)赋值给变量. ''' #赋值运算符 Int=12 Float=12.2 String="hello" List=[1,2,"hell"] Touple=(4,"hell") Dictionary={'one

  • Python中的变量和作用域详解

    作用域介绍 python中的作用域分4种情况: L:local,局部作用域,即函数中定义的变量: E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的: G:globa,全局变量,就是模块级别定义的变量: B:built-in,系统固定模块里面的变量,比如int, bytearray等. 搜索变量的优先级顺序依次是:作用域局部>外层作用域>当前模块中的全局>python内置作用域,也就是LEGB. x = int(2.9) # int bu

  • 深入解析Python中的变量和赋值运算符

    Python 变量类型 变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据类型,这些变量可以存储整数,小数或字符. 变量赋值 Python中的变量不需要声明,变量的赋值操作既是变量声明和定义的过程. 每个变量在内存中创建,都包括变量的标识,名称和数据这些信息. 每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建. 等号(=)用来给变量赋值. 等号(=)运算符左边是一

  • python中的变量如何开辟内存

    python下的变量 不需要预先声明变量的类型,变量的类型和值在赋值的那一刻被初始化(声明和定义的过程一起完成) 在python中, 每一个变量在内存中创建,我们可以通过变量来查看内存中的值 哈哈,这里是不是很熟悉,跟c中的指针一样啊(访问内存中的值) 首先大家需要了解一点:在python中: x =5之后,我们要了解它的过程:系统先是找了一块内存,将5存储了进去,紧接着x指向了当前的这块内存 预测1:python下的变量是一个指针 >>> x = 4 >>> y =

  • Python动态声明变量赋值代码实例

    这篇文章主要介绍了Python动态声明变量赋值代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 通过exec().globals()和locals() # 通过exec() for i in range(1, 4): # 第一次循环 i=1 时,会执行字符串中的python语句 ex1 = "exec1",以此类推 exec(f'ex{i} = "exec{i}"') # 通过globals()和locals

  • Python中可变变量与不可变变量详解

    目录 一 .常见的变量分类 1.变量的创建 二.变量分类 1..常见的不可变变量 2.常见的可变变量 三.拷贝的差别 四.参数传递的差别 前言: C++不同于Python的显著特点,就是有指针和引用,这让我们在调用参数的时候更加清晰明朗.但Python中没有指针和引用的概念,导致很多时候参数的传递和调用的时候会产生疑问:我到底是复制了一份新的做操作还是在它指向的内存操作? 这个问题根本上和可变.不可变变量有关,我想把这个二者的区别和联系做一个总结,以更深入地理解Python内部的操作.我本身非科

随机推荐