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

目录
  • 一 、常见的变量分类
    • 1、变量的创建
  • 二、变量分类
    • 1、、常见的不可变变量
    • 2、常见的可变变量
  • 三、拷贝的差别
  • 四、参数传递的差别

前言:

C++不同于Python的显著特点,就是有指针和引用,这让我们在调用参数的时候更加清晰明朗。但Python中没有指针和引用的概念,导致很多时候参数的传递和调用的时候会产生疑问:我到底是复制了一份新的做操作还是在它指向的内存操作?

这个问题根本上和可变、不可变变量有关,我想把这个二者的区别和联系做一个总结,以更深入地理解Python内部的操作。我本身非科班出身,如有不当之处敬请批评指正。

一 、常见的变量分类

1、变量的创建

在了解可变、不可变变量的基本定义之前,我们需要明白变量是如何被创建的。

x = 1

python解释器会判断1在内存中是否存在,若不存在,python会分配内存,在内存中创建数字1,然后看变量x是否存在,若不存在就创建x,最后把1赋值给x。

y = 1

当继续输入上行代码时,1已经在内存中被创建了,现在是否需要重新创建一个1,然后赋值给y呢?还是直接将刚才就创建好的1赋值给y呢?答案是后者。我们可以通过id或者is来判断是否在内存中是同一个地址。

print(id(x) == id(y))
# or
print(x is y)

但当我们换成一个列表来尝试呢?

a = [1,2,3]
b = [1,2,3]
print(id(a) == id(b))

答案却和上面的结果相反,也就是说内存中即使有了x的[1,2,3],python中要创建把[1,2,3]赋给y的时候并没有把x指向的那个赋过去,而是重新在内存中开辟了一块新的空间,创建了一个新的[1,2,3]!这就引出了可变和不可变变量。

字面意思
按照我的个人理解,可变变量(mutable variable)就是内存中内容可以被修改的变量,而不可变变量(immutable variable)就是内存中内容不可以被修改的变量。

听起来比较抽象。我们可以把变量名理解为一个指针或者引用,他们都指向了内存中的一块空间。比如上节中x和y同时指向了1的那块空间,a指向了[1,2,3]的那部分。那么如何理解内存中的内容可以被修改呢?对于一个int型的变量,我创建了1,那么这之后*任何在这个作用域中所有被赋为1 的变量都会指向它,而外部没有方法来把这个内存中的内容改成2或者其他值*。而对于列表来说,那块[1,2,3]我随时可以把他改为[1,2,3,4],这就是内存中内容可以被修改。

二、变量分类

所有的变量都可以按可变、不可变变量来分类,那么我将常用的一些变量类型进行分类。

1、、常见的不可变变量

  • 整型
  • 浮点型
  • 布尔型
  • 复数
  • 字符串
  • 元组

2、常见的可变变量

  • 列表
  • 集合
  • 字典
  • 其他迭代器

三、拷贝的差别

copydeepcopy都表示拷贝,那么二者的区别就在于可变、不可变对象。copydeepcopy对于不可变对象来说是没有区别的,都是把指向内存已有的空间的引用进行拷贝;但对于可变对象,copy是拷贝指向内存已有空间的引用,而deepcopy才是新开辟一块空间,将原来的内容完全拷贝,然后返回新的空间的引用。

四、参数传递的差别

参数传递的过程也是很容易出现疑惑的过程。C++中的参数传递很明确,引用就是引用,形参就是形参,但Python中不是,因为python中没有明确的指针、引用。

对不可变变量,传递进函数后由于作用域改变,函数内部有新的空间,因此会产生形参,将原来的不可变变量进行复制,然后在函数内部进行后续操作。

对可变变量,本身内容就可以被修改,那么在函数内部也允许修改本身,因此传递进函数的是该内存空间的引用,对该参数操作,相应的在主函数也会被修改。

到此这篇关于Python中可变变量与不可变变量详解的文章就介绍到这了,更多相关Python中可变变量与不可变变量内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python实现可变变量名方法详解

    如果要写一个程序,让x1为1,x2为2,然后直到x100为100,你会怎么做? 在C这种静态语言里,变量名这个标识符实际上会被编译器直接翻译成内存地址,所以除了手动设置每个变量的值以外,没办法做到这点.而Python这种动态语言则是可以做到的. 最容易想到的自然是eval,但是实际上根本不需要这种危险的东西,因为Python的变量名就是一个字典的key而已.要获取这个字典,直接用locals和globals函数即可. 因此这个程序可以这样实现: 代码如下: >>> names = loc

  • python中函数总结之装饰器闭包详解

    1.前言 函数也是一个对象,从而可以增加属性,使用句点来表示属性. 如果内部函数的定义包含了在外部函数中定义的对象的引用(外部对象可以是在外部函数之外),那么内部函数被称之为闭包. 2.装饰器 装饰器就是包装原来的函数,从而在不需要修改原来代码的基础之上,可以做更多的事情. 装饰器语法如下: @deco2 @deco1 def func(arg1,arg2...): pass 这个表示了有两个装饰器的函数,那么表示的含义为:func = deco2(deco1(func)) 无参装饰器语法如下:

  • Python中set与frozenset方法和区别详解

    set(可变集合)与frozenset(不可变集合)的区别: set无序排序且不重复,是可变的,有add(),remove()等方法.既然是可变的,所以它不存在哈希值.基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交集), difference(差集)和sysmmetric difference(对称差集)等数学运算. sets 支持 x in set, len(set),和 for x in set.作为一个无序的集合,sets不记录元素位

  • Python 中的pygame安装与配置教程详解

    安装软件环境及版本说明 OS: Win10 x 64 专业版 Python: 2.7 IDE: PyCharm Community 2018 1. 安装python 1)下载并安装python python官网下载需要的版本,并安装(安装过程很简单,步骤略) https://www.python.org/downloads/windows/ 这里下载的是python2.7 2)配置环境变量 如果安装python时,没有勾选添加python到环境变量PATH,则需要手动添加 3)验证是否安装+配置

  • python中前缀运算符 *和 **的用法示例详解

    这篇主要探讨 ** 和 * 前缀运算符,**在变量之前使用的*and **运算符. 一个星(*):表示接收的参数作为元组来处理 两个星(**):表示接收的参数作为字典来处理 简单示例: >>> numbers = [2, 1, 3, 4, 7] >>> more_numbers = [*numbers, 11, 18] >>> print(*more_numbers, sep=', ') 2, 1, 3, 4, 7, 11, 18 用途: 使用 * 和

  • Python 中的函数装饰器和闭包详解

    函数装饰器可以被用于增强方法的某些行为,如果想自己实现装饰器,则必须了解闭包的概念. 装饰器的基本概念 装饰器是一个可调用对象,它的参数是另一个函数,称为被装饰函数.装饰器可以修改这个函数再将其返回,也可以将其替换为另一个函数或者可调用对象. 例如:有个名为 decorate 的装饰器: @decorate def target(): print('running target()') 上述代码的写法和以下写法的效果是一样的: def target(): print('running targe

  • Python中更优雅的日志记录方案详解

    目录 常见使用 loguru 安装 基本使用 详细使用 在 Python 中,一般情况下我们可能直接用自带的 logging 模块来记录日志,包括我之前的时候也是一样.在使用时我们需要配置一些 Handler.Formatter 来进行一些处理,比如把日志输出到不同的位置,或者设置一个不同的输出格式,或者设置日志分块和备份.但其实个人感觉 logging 用起来其实并不是那么好用,其实主要还是配置较为繁琐. 常见使用 首先看看 logging 常见的解决方案吧,我一般会配置输出到文件.控制台和

  • python中函数的返回值及类型详解

    目录 1.返回值介绍 2.带有返回值的函数 3.保存函数的返回值 4.四种函数的类型 1.无参数,无返回值的函数 2.无参数,有返回值的函数 3.有参数,无返回值的函数 4.有参数,有返回值的函数 5.小结 5.在python中我们可不可以返回多个值? 1.返回值介绍 现实生活中的场景: 我给儿子10块钱,让他给我买包烟.这个例子中,10块钱是我给儿子的,就相当于调用函数时传递到参数,让儿子买烟这个事情最终的目标是,让他把烟给你带回来然后给你对么,,,此时烟就是返回值 开发中的场景: 定义了一个

  • Python 中 Virtualenv 和 pip 的简单用法详解

    本文介绍了Python 中 Virtualenv 和 pip 的简单用法详解,分享给大家,具体如下: 0X00 安装环境 我们在 Python 开发和学习过程中需要用到各种库,然后在各个不同的项目和作品里可能用的版本还不一样,正因为有这种问题的存在才催生了virtualenv的诞生.virtualenv 可以在电脑上创建一个虚拟环境,可以针对每一个项目创建一个虚拟环境,这样就不用担心各个不同的项目用不同版本的库的时候出现的冲突了. 下面的内容只适用于 Linux/OSX,未经 Windows 环

  • python中 chr unichr ord函数的实例详解

    python中 chr unichr ord函数的实例详解 chr()函数用一个范围在range(256)内的(就是0-255)整数作参数,返回一个对应的字符.unichr()跟它一样,只不过返回的是Unicode字符,这个从Python 2.0才加入的unichr()的参数范围依赖于你的python是如何被编译的.如果是配置为USC2的Unicode,那么它的允许范围就是range(65536)或0x0000-0xFFFF:如果配置为UCS4,那么这个值应该是range(1114112)或0x

  • python中函数默认值使用注意点详解

    当在函数中定义默认值时,值初始化只会进行一次,就是执行到def methodname时执行.看下面代码: from datetime import datetime def test(t=datetime.today()): print t if __name__ == "__main__": test() test() 两次方法调用输出的时间都为同一个值,而不是我们预想当前执行时间.对于上面这种情况,建议用下面的方式实现: from datetime import datetime

随机推荐