python数据类型可变与不可变深入分析

目录
  • 一.可变类型与不可变类型的特点
    • 1.不可变数据类型
    • 2.可变数据类型
  • 二.哪些是可变类型哪些是不可变类型

一.可变类型与不可变类型的特点

1.不可变数据类型

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

举例子:

>>> x = 18
>>> id(x)
4497811200
>>> id(18)
4497811200
>>> x = 19
>>> id(x)
4497811232
>>> id(18)
4497811200
>>> y = 18
>>> id(y)
4497811200
>>>

一开始x = 18,开辟一块地址为4497811200的内存,即18对应的地址为4497811200,后来x = 19 ,重新开辟一块地址为4497811232的内存来放19,可以看到不变的意思是指18,和19在内存中的地址不会改变,将18赋值给y时,y指向的地址即为4497811200。

2.可变数据类型

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

>>> x = [1,2,3]
>>> id(x)
4501838920
>>> y = [1,2,3]
>>> z = [1,2,3]
>>> id(y)
4501838600
>>> id(z)
4501838664

从另外一个角度来看:

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

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

#a的值改变了,a对应的内存地址也改变了
>>> a=1
>>> id(a)
4497810656
>>> a = 2
>>> id(2)
4497810688
#直接对a操作,相当于拷贝了一份a的值,在其他内存地址操作,a的值不变
>>> a+1
3
>>> id(a)
4497810688
>>> a
2
#b的值改变了,b对应的内存地址不变,第一次给b赋值的时候,给b划分一块内存空间,该空间就不变了
>>> b = [1,2,3]
>>> id(b)
4501839496
#直接对b操作,b的值改变,b指向的内存空间不变
>>> b.append(4)
>>> id(b)
4501839496
>>> b
[1, 2, 3, 4]
>>>

二.哪些是可变类型哪些是不可变类型

不可变:Number(数字)、String(字符串)、Tuple(元组)。

#整型
a = 1
print(id(a), type(a))
a = 2
print(id(a), type(a))
# 4361254304 <class 'int'>
# 4361254336 <class 'int'>
#字符串
b = 'anne'
print(id(b),type(b))
b = 'anne1995'
print(id(b),type(b))
# 4363638744 <class 'str'>
# 4363684784 <class 'str'>
#元组
c1 = ['1','2']
c = (1,2,c1)
print(c,id(c),type(c))
c1[1] = 'djx'
print(c,id(c),type(c))
# (1, 2, ['1', '2']) 4363948248 <class 'tuple'>
# (1, 2, ['1', 'djx']) 4363948248 <class 'tuple'>

可以变:Set(集合)、List(列表)、Dictionary(字典)。

#集合
s = {1, 'd', '34', '1', 1}
print(s, type(s), id(s))
s.add('djx')
print(s, type(s), id(s))
# {1, '1', 'd', '34'} <class 'set'> 4401385256
# {1, '1', '34', 'd', 'djx'} <class 'set'> 4401385256
#列表
list = [1,'q','qwer',True]
print(list,type(list),id(list))
list.append('djx')
print(list,type(list),id(list))
# [1, 'q', 'qwer', True] <class 'list'> 4401113608
# [1, 'q', 'qwer', True, 'djx'] <class 'list'> 4401113608
#字典
tuple = (1)
dic = {1:2}
d = { tuple:1,'key2':'djx','key3':'li'}
print(d,type(d),id(d))
d['key4'] = 'haha'
print(d,type(d),id(d))
# {1: 1, 'key2': 'djx', 'key3': 'li'} <class 'dict'> 4401075976
# {1: 1, 'key2': 'djx', 'key3': 'li', 'key4': 'haha'} <class 'dict'> 4401075976

注意:此时元组的值发生了变化而内存地址没变,但我们依然称元组为不可变类型,为什么呢?其实改的是元组中的列表,列表是可变类型,改变了值后地址依然不变。但是元组的定义就是不可变的,

元组被称为只读列表,即数据可以被查询,但不能被修改。

以上就是python数据类型可变与不可变深入分析的详细内容,更多关于python可变不可变数据类型的资料请关注我们其它相关文章!

(0)

相关推荐

  • python可变对象,不可变对象详解

    在写python程序时,对于可变对象和不可变对象这里理解不深,导致总会犯一些细节错误.以下面的程序举例: ab = {'a':1, 'b':2} list1 = [] for i in range(2,5): ab['a'] = i list1.append(ab) print(list1) # [{'a': 4, 'b': 2}, {'a': 4, 'b': 2}, {'a': 4, 'b': 2}] 这段代码本以为结果应该是[{'a': 2, 'b': 2}, {'a': 3, 'b': 2

  • python字符串不可变数据类型

    目录 一.截取子串-切片 二.查找子串及数量 三.字符串的替换.分割以及合并 四.字母的大小写 五.删除侧边的空白 六.对齐方式 七.判断首位字符是否正确(返回布尔值) 八.判断字母.数以及空格 一.截取子串-切片 方法:字符串名[初始位置:结束位置:步长] str1 = 'abcdefg' print(str1[:]) # abcdefg print(str1[0:2]) # ab 左闭右开 print(str1[0:2:1]) # ab 默认步长为1 print(str1[:3]) # ab

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

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

  • Python 的可变和不可变对象详情

    目录 Python 中的可变和不可变对象 一.文字描述可变和不可变对象 1.可变与不可变对象归类 2.可变与可变对象的区别 3.不可变对象的应用场景 二.代码角度区别 1.不可变对象-整型 2.不可变对象-字符串 3.不可变对象-元组 4.可变对象列表 三.Python 函数的参数传递 1.参数传递不可变对象 2.参数传递可变对象 Python 中的可变和不可变对象 一.文字描述可变和不可变对象 在 Python 中,一切皆为对象 Python 中不存在值传递,一切传递的都是对象的引用,也可以认

  • Python可变集合和不可变集合的构造方法大全

    目录 一.对比数据类型 二.可变集合构造方法 三.不可变集合的构造方法 四.集合构造注意事项  Python集合又是一种新的数据类型,集合有两种形式:可变集合(set())和不可变集合(frozenset())两种,这两种集合操作方法比较类似,但是在底层性质上有截然想法的区别.集合是一种无序的,不重复且不可随机访问的元素集合,在概念和运算上和数学中的集合类似,集合分为可变和不可变两种. 一.对比数据类型 下面是我们学习过的一些数据类型,下面的注释是对比这些数据类型的结果,供学习集合前的参考. s

  • Python中可变和不可变对象的深入讲解

    目录 前置知识 有哪些可变对象,哪些不可变对象? 不可变对象和可变对象的区别? 不可变对象的应用场景 从内存角度出发说下有什么区别? 不可变对象 可变对象 从代码角度看看区别 不可变对象-整型 不可变对象-字符串 不可变对象-元组 可变对象列表 Python 函数的参数传递 概念 参数传递不可变对象 参数传递可变对象 总结 前置知识 在 Python 中,一切皆为对象 Python 中不存在值传递,一切传递的都是对象的引用,也可以认为是传址 有哪些可变对象,哪些不可变对象? 不可变对象:字符串.

  • python数据类型可变与不可变深入分析

    目录 一.可变类型与不可变类型的特点 1.不可变数据类型 2.可变数据类型 二.哪些是可变类型哪些是不可变类型 一.可变类型与不可变类型的特点 1.不可变数据类型 不可变数据类型在第一次声明赋值声明的时候, 会在内存中开辟一块空间, 用来存放这个变量被赋的值,  而这个变量实际上存储的, 并不是被赋予的这个值, 而是存放这个值所在空间的内存地址, 通过这个地址, 变量就可以在内存中取出数据了. 所谓不可变就是说, 我们不能改变这个数据在内存中的值, 所以当我们改变这个变量的赋值时, 只是在内存中

  • python数据类型可变不可变知识点总结

    python的数据类型可变不可变 1.什么是可变不可变 首先说一下什么是Python数据的可变不可变. 我们都知道定义变量的时候,是先创建一块内存空间,将值放进去,然后变量名里存放着该内存空间的内存地址.现在我们就可以解释了. 可变类型:就是这个数据类型的值在不改变这一块内存空间,而去改变这个数据类型的值. 不可变类型:当改变值得时候,会申请一块新的内存空间,不再是原来的那一块内存空间了. 2.不可变类型 数据类型中,有哪些是不可变类型呢? 在Python设计中,整数.浮点型.字符串.元祖都是不

  • python中数字是否为可变类型

    本文以Python3为例,包括六种数据类型: 1.数字(Number):         int整型         long长整型         float浮点数         complex复数         布尔值(0和1) 2.字符串(String) 3.列表(List) 4.元组(Tuple) 5.字典(Dictionary) 6.集合(Set) 通过id函数查看变量i的内存地址进行验证(使用hex(id(i)) 可以查看16进制的内存地址) 不可变类型:Number.Strin

  • Python可变与不可变数据和深拷贝与浅拷贝

    目录 浅拷贝和深拷贝 什么是可变数据和不可变数据 那么拷贝函数是干什么的? 浅拷贝 深拷贝 总结 浅拷贝和深拷贝 拷贝函数是专门为可变数据类型list.set.dict使用的一种函数.作用是,当一个值指向另一个值的时候,也不会影响指向的值,如果被指向的数据是可变数据,那么它一旦被修改,指向的数据也会随之改变. 什么是可变数据和不可变数据 我们来举一个例子,整型是不可变的数据,那么为什么是不可变的数据呢?一个数据是不是可变的就要关系到python的缓存机制. 当一个数据发生变化,如果它的内存地址没

  • python元组的可变与不可变问题

    目录 python元组的可变与不可变 为什么元组Tuple是不可变的,列表List是可变的 1.所谓元组的不可变指的是元组所指向的内存中的内容不可变 2.List 是可变的 总结 python元组的可变与不可变 学过python的人都知道有一种数据类型叫做元组,而元组与列表最重要的区别就在于元组一经定义就不能改变其内容,但元组中的内容真的是完全不可变的吗,看了下面这段代码想必你也会产生这样的疑问. 代码如下: tuple = (1, 2, 3, [1, 4, 7]) print(tuple) t

  • python变量赋值方法(可变与不可变)

    python中不存在所谓的传值调用,一切传递的都是对象的引用,也可以认为是传址. 一.可变对象和不可变对象 Python在heap中分配的对象分成两类:可变对象和不可变对象.所谓可变对象是指,对象的内容可变,而不可变对象是指对象内容不可变. 不可变(immutable):int.字符串(string).float.(数值型number).元组(tuple) 可变(mutable):字典型(dictionary).列表型(list) 不可变类型特点: 看下面的例子(例1) i = 73 i +=

  • Python可变和不可变、类的私有属性实例分析

    本文实例讲述了Python可变和不可变.类的私有属性.分享给大家供大家参考,具体如下: 可变和不可变 items = [] print(id(list)) items.append(2) # items值改变了 print(id(list)) # 但内存地址没有变 id()函数获取内存地址. a = "jack" print(id(a)) b = "jack" print(id(b)) # b内存地址和上面a一样 a = "zhangSan" p

  • python新手学习可变和不可变对象

    python中有可变对象和不可变对象,可变对象:list,dict.不可变对象有:int,string,float,tuple. python不可变对象 int,string,float,tuple 先来看一个例子 def int_test(): i = 77 j = 77 print(id(77)) #140396579590760 print('i id:' + str(id(i))) #i id:140396579590760 print('j id:' + str(id(j))) #j

随机推荐