python可变类型与不可变类型
一.可变类型与不可变类型的特点
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。
1.可变数据类型
结合不可变数据类型,可变数据类型就很好理解来,可变数据类型是指变量所指向的内存地址处的值是可以被改变的。
>>> 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 = ['','']
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', '', '', 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可变类型vs不可变类型,深拷贝vs浅拷贝
核心提示: 可变类型 Vs 不可变类型 可变类型(mutable):列表,字典 不可变类型(unmutable):数字,字符串,元组 这里的可变不可变,是指内存中的那块内容(value)是否可以被改变 ...
- Python的可变类型与不可变类型
Python基础知识,自己写一写比较不容易忘 Python的每个对象都分为可变和不可变,主要的核心类型中,数字.字符串.元组是不可变的,列表.字典是可变的. 对不可变类型的变量重新赋值,实际上是重新创 ...
- python可变类型和不可变类型
原文地址:http://www.cnblogs.com/huamingao/p/5809936.html 可变类型 Vs 不可变类型 可变类型(mutable):列表,字典 不可变类型(unmutab ...
- Python——可变类型与不可变类型(即为什么函数默认参数要用元组而非列表)
Python 的内建标准类型有一种分类标准是分为可变类型与不可变类型: 可变类型:列表.字典 不可变类型:数字.字符串.元组 因为变量保存的实际都是对象的引用,所以在给一个不可变类型(比如 int)的 ...
- 26、Python的可变类型和不可变类型?
Python的每个对象都分为可变和不可变 可变:列表.字典 不可变:数字.字符串.元祖 对不可变类型的变量重新赋值,实际上是重新创建一个不可变类型的对象,并将原来的变量重新指向新创建的对象(如果没有其 ...
- python的可变数据类型和不可变类型
python里面一切皆对象 ython的每个对象都分为可变类型和不可变类型 整形,浮点型,字符串,元组属于不可变类型,列表,字典是可变类型 不可变数据类型 对不可变类型的变量重新赋值,实际上是重新创建 ...
- Python探索记(16)——Python的可变类型与不可变类型
# @Time : 2017/7/8 17:49 # @Author : 原创作者:谷哥的小弟 # @Site : 博客地址:http://blog.csdn.net/lfdfhl # @DESC : ...
- python的可变类型和不可变类型
Python有六种数据类型:数字类型.字符串类型.列表类型.元组类型.字典类型和集合类型 其中不可变类型包括三种:数字类型.字符串类型和元组类型 剩余三种为可变类型:列表类型.字典类型和集合类型 可变 ...
- python可变类型和不可变类型,深拷贝vs浅拷贝
转载:https://www.cnblogs.com/huamingao/p/5809936.html 核心提示: 可变类型 Vs 不可变类型 可变类型(mutable):列表,字典 不可变类型(un ...
- python中可变类型和不可变类型
1.python中的可变类型和不可变类型 python中的数据类型大致可分为6类:1.Number(数字) 2. String(字符串) 3. Tuple (元组) 4. List(列表) 5. Di ...
随机推荐
- c++ 珊格画椭圆
#ifndef _TEST_H #define _TEST_H #include <iostream> #include <math.h> using namespace st ...
- Apache Flink - Batch(DataSet API)
Flink DataSet API编程指南: Flink中的DataSet程序是实现数据集转换的常规程序(例如,过滤,映射,连接,分组).数据集最初是从某些来源创建的(例如,通过读取文件或从本地集合创 ...
- Go by Example-常量
Go by Example 中文:常量 在上一节中提到了变量,常用的有两种定义的方式使用var或者短变量的形式进行定义,这节我们来说常量. 常量 常量是指程序运行时不可改变的值,常量必须初始化值,定义 ...
- 微信小程序设置滚动条
前言 又很久没有写东西了,上周开始将一个APP和一个网站的内容整合到微信小程序中,到这会儿终于搞得快结束了,才发现为啥我的小程序滚动视图没有滚动条,这是闹哪样,没有滚动条的滚动是没有灵魂的. 客官可移 ...
- RK3288 st7703 mipi屏指令过长,程序跑飞
本文为博主原创文章,转载请注明出处:https://www.cnblogs.com/lialong1st/p/11218433.html CPU:RK3288 系统:Android 5.1 调试 mi ...
- python人生如初见之初见yield
今天学习爬虫Scrapy框架搭建的时候,了解了yield的用法.了解一个东西,无外乎 WHAT? HOW? WHY? WHAT yield英文意思是屈服,退位,放弃.额...其实它是Python中的一 ...
- idhttp访问DATASNAP有密码验证的中间件
idhttp访问DATASNAP有密码验证的中间件 用TIDHttp访问DataSnap Rest服务器,在服务器采用了用户验证的情况下,客户端需要提交密码,否则不能正常连接. procedure T ...
- leetcode 143. Reorder List 、86. Partition List
143. Reorder List https://www.cnblogs.com/grandyang/p/4254860.html 先将list的前半段和后半段分开,然后后半段进行逆序,然后再连接 ...
- Swift_IOS之UIActivityIndicatorView加载齿轮控件
// // ViewController.swift // helloIOS // // Created by loaderman on 2019/1/25. // Copyright © 2019年 ...
- videojs调整音频播放语速
参考来源: https://stackoverflow.com/questions/19112255/change-the-video-playback-speed-using-video-js 以下 ...