首页 > 编程语言 >python:可变类型与不可变类型

python:可变类型与不可变类型

时间:2023-09-13 23:55:42浏览次数:40  
标签:num1 num2 python 数据类型 print 可变 类型 内存地址

python:可变类型与不可变类型

一、引用变量与变量在存储的存储形式

image-20230913160748640

在python有个id()方法,可以获取某个变量指向的内存地址

num1 = 10  # num1实际储存在栈内存中,当调用num1时通过内存地址引用储存在数据区中的10

# 如果把num1的值赋予num2,两者是什么关系呢
num2 = num1
print(num1, num2)
print(id(num1), id(num2))  # 会得到相同的内存地址,两者对数字10都是引用关系

# 在赋值之后,我们改变num1的值,num2是否会受到影响?
num1 = 100
print(id(num1))  # 140717001506144
print(id(num2))  # 140717001509024

# 结论:num2没有被影响,因为num1与num2都是数值类型(不可变类型),一个值的改变不会影响另一个值
# 不可变类型:内存地址一旦固定,其值就没有办法发生改变了,比如这块地址原来存放了10,想把它设置为100,不行,因为这块地址无法调整。重新开辟一块新的内存空间存储100,将内存地址赋予num1(num1与num2指向两块不同的内存地址,所以两者不会互相影响)

image-20230913161354560

  • 数值类型是不可变数据类型,改变其值,其内存地址也会发生改变(重新开辟空间,保存新的数据,变量指向新的数据内存地址)

image-20230913162544319

二、不可变数据类型

如上图所示:

不可变数据类型在第一次声明赋值声明的时候, 会在内存中开辟一块空间, 用来存放这个变量被赋的值, 而这个变量实际上存储的, 并不是被赋予的这个值, 而是存放这个值所在空间的内存地址, 通过这个地址, 变量就可以在内存中取出数据了. 所谓不可变就是说, 我们不能改变这个数据在内存中的值, 所以当我们改变这个变量的赋值时, 只是在内存中重新开辟了一块空间, 将这一条新的数据存放在这一个新的内存地址里, 而原来的那个变量就不在引用原数据的内存地址而转为引用新数据的内存地址了

不可变数据类型:数值型,布尔类型,字符串类型,元组类型
  • 不可变类型:内存地址一旦固定,其值无法改变的数据类型。

三、可变数据类型:

结合不可变数据类型,可变数据类型就很好理解来,可变数据类型是指变量所指向的内存地址处的值是可以被改变的。

可变数据类型:列表,字典,集合
  • 可变类型:内存地址一旦固定,其值可以改变的类型。
list1 = [1, 2, 3]
print(id(list1))  # 

# 向列表中追加一个元素,改变列表的值
list1.append(4)
print(id(list1))  # 

image-20230913173904230

追加元素,改变列表的值其内存地址没有发生改变:
image-20230913174052061

从另外一个角度来看:

可变类型:当该数据类型的对应变量的值发生了改变,那么它对应的内存地址也会发生改变,对于这种数据类型,就称不可变数据类型。

可变数据类型:当该数据类型的对应变量的值发生了改变,那么它对应的内存地址不发生改变,对于这种数据类型,就称可变数据类型。

四、可变与不可类型对传参的影响

案例1:可变数据类型

def func1(list1):
    # 相当于 list1 = list2   
    list1.append('赵六')
    return list1


list2 = ['张三', '李四', '王五']

func1(list2)
print(list2)  # ['张三', '李四', '王五', '赵六']
  • list是可变数据类型,list1与list2指向同一块内存地址,可以改变列表中的值

案例2:不可变数据类型

def func2(num1):
    # 相当于 num1 = num2
    num1 += 1
    return num1


num2 = 10
func2(num2)
print(num2)  # 10

image-20230913192829540

  • 将num2 赋值给num1之后,相当于num1与num2指向同一块内存地址,当实现num1的值改变时,因为num是不可改变类型,只能重新开辟一块新的内存空间保存11,并将地址赋予num1

五、扩展:元组拆包

1、什么是拆包?

简单来说就是将元组中的数据一个一个拆解出来的过程,被称之为拆包操作。

2、基本语法

tuple1 = (10, 20)
# 拆包
num1 , num2 = tuple1

# 以上代码可以简写
num1 , num2 = (10, 20)

# 还可以进一步简写
num1 , num2 = 10 , 20
  • 左边变量的数量要与元组的数据的数量一致

3、元组拆包的典型案例

a = '可乐'
b = '牛奶'

# 之前实现交换都是引用第三变量temp
a , b = b , a

print(a) # 牛奶
print(b) # 可乐

标签:num1,num2,python,数据类型,print,可变,类型,内存地址
From: https://www.cnblogs.com/luoluoange/p/17701132.html

相关文章

  • Python基于License的项目授权机制
    1需求说明当项目平台被首次部署在服务器上时,系统是没有被授权的。当客户希望将平台部署到某一台特定的服务器进行使用时,需要提供该服务器的MAC地址,以及授权到期时间,请求获取授权码,收到授权码后,就能正常使用迁移平台。授权方收到授权请求时,获得平台安装的目标服务器的MAC地址......
  • Python学习笔记-Python函数进阶
    函数多返回值思考如果一个函数有两个return,程序如何执行?例如:defreturn_num():return1return2result=return_num()print(result)上面代码只执行了第一个return,因为retrun可以退出当前函数,导致return下方的代码不执行。多个返回值如果一个函数要有多个返回值,书写方式示......
  • python
    Day01计算机基础和环境搭建课程概要计算机基础编程本质Python的介绍Python环境的搭建计算机基础1.1基本概念计算机的组成计算机是由多个硬件组合而成,常见的硬件有CPU,硬盘,内存,网卡,显示器,机箱,电源...注意事项:机械将零件组合到一起,他们是无法进行协作的操作系统......
  • 【计算机视觉开发(一)】: yolov5与python环境安装
    前言:最近正在学习计算机视觉开发这块,打算开通一个专栏记录学习总结以及遇到的问题汇总。本篇是这个系列的第一篇,主要是环境安装以及yolov5的介绍。关于计算机视觉:参考:百度百科-关于计算机视觉)计算机视觉是一门研究如何使机器“看”的科学,更进一步的说,就是是指用摄影机和......
  • 复习课3 C语言中常用的数据类型
    一.导入我们在生活中会遇到很多的数据,这些数有的是整数,比如说:12345,有的是浮点数(小数)比如说:0.51.13.14等等,那么我们在生活中需要用到各种数据,那么在程序中是否也是有不同的数据类型呢?答案是肯定的二.C语言中常用的数据类型int //整型数据类型double//双精度浮点类型float......
  • Redis7 10大数据类型(Redis列表)
    一、常用二、单key多value三、简单说明一个双端链表的结构,容量是2的32次方减1个元素,大概40多亿,主要功能有push/pop等,一般用在栈、队列、消息队列等场景。left、right都可以插入添加;如果键不存在,创建新的链表;如果键已存在,新增内容;如果值全移除,对应的键也就消失了。它的底层实......
  • 自定义类型-结构体(结构体,枚举,联合)2
       上节写到结构体对齐数,以及系统默认对齐数的修改,以及对齐数为何出现,实际上是牺牲一部分空间来换取读取速度也就是时间的方法。在这里插入一段结构体函数传参的内容以下代码为结构体初始化,使用自定义函数进行初始化,传递的时候使用了结构体地址。structS{ inta; charc......
  • SQLite - Python
    安装SQLite3可使用sqlite3模块与Python进行集成。sqlite3模块是由GerhardHaring编写的。它提供了一个与PEP249描述的DB-API2.0规范兼容的SQL接口。您不需要单独安装该模块,因为Python2.5.x以上版本默认自带了该模块。为了使用sqlite3模块,您首先必须创建一......
  • Go每日一库之8:cast(类型转换)
    简介今天我们再来介绍spf13大神的另一个库cast。cast是一个小巧、实用的类型转换库,用于将一个类型转为另一个类型。最初开发cast是用在hugo中的。快速使用先安装:$gogetgithub.com/spf13/cast后使用:packagemainimport("fmt""github.com/spf13/cast")fun......
  • 软件测试|Python数据可视化神器——pyecharts教程(八)
    Pyecharts绘制热力图当涉及可视化数据时,热力图是一种强大的工具,它可以帮助我们直观地了解数据集中的模式和趋势。在本文中,我们将学习如何使用Python中的Pyecharts库创建热力图,以便将数据转化为可视化的形式。什么是热力图?热力图是一种用于显示数据密度的二维图表,其中颜色的变化......