知识点:tuple 元素真的不可变吗
tuple 元素真的不可变吗
有一种有序列表叫元组:tuple。
tuple和list非常类似,但是tuple一旦初始化就不能修改,比如同样是列出单位或同学的名字:
>>> classmates = ('Michael', 'Bob', 'Tracy')
现在,classmates这个tuple不能变了,它也没有append(),insert()这样的方法。其他获取元素的方法和list是一样的,你可以正常地使用classmates[0],classmates[-1],但不能赋值成另外的元素。
不可变的tuple有什么意义?
因为tuple不可变,所以代码更安全。
如果可能,能用tuple代替list就尽量用tuple。
“可变的”tuple:
>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])
这个tuple定义的时候有3个元素,分别是'a','b'和一个list。
不是说tuple一旦定义后就不可变了吗?怎么后来又变了?
表面上看,tuple的元素确实变了,但其实变的不是tuple的元素,而是list的元素。tuple一开始指向的list并没有改成别的list,
所以,tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。
即指向'a',就不能改成指向'b',指向一个list,就不能改成指向其他对象,但指向的这个list本身是可变的!
理解了“指向不变”后,要创建一个内容也不变的tuple怎么做?
必须保证tuple的每一个元素本身也不能变。
知识点:tuple 元素真的不可变吗的更多相关文章
- Java基础知识强化101:Java 中的 String对象真的不可变吗 ?
1. 什么是不可变对象? 众所周知, 在Java中, String类是不可变的.那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对 ...
- 运行期以索引获取tuple元素-C++14
在编译期很容易根据索引来获取对应位置的元素,因为 tuple 的帮助函数 std::get<N>(tp) 就能获取 tuple 中第 N 个元素.然而我们却不能直接在运行期通过变量来获取 ...
- 运行期以索引获取tuple元素-C++17
//运行期以索引获取tuple元素-C++17 //需支持C++17及以上标准的编译器,VS2017 15.5.x.CodeBlocks 16.01 gcc 7.2 //参见:http://purec ...
- 运行期以索引获取tuple元素-C++11之2
//运行期以索引获取tuple元素-C++11之2 //需支持C++11及以上标准的编译器,VS2017 15.5.x.CodeBlocks 16.01 gcc 7.2 //参见<深入应用C++ ...
- 运行期以索引获取tuple元素-C++11之1
//运行期以索引获取tuple元素-C++11之1 //需支持C++11及以上标准的编译器,VS2017 15.5.x.CodeBlocks 16.01 gcc 7.2 //参见<深入应用C++ ...
- 遍历输出tuple元素的简洁方式(C++11)
//遍历输出tuple元素的简洁方式(C++11) //Win32Con17_VS2017_01.cpp #include <iostream> #include <tuple> ...
- 运行期以索引获取tuple元素-C++14(原创)
在编译期很容易根据索引来获取对应位置的元素,因为 tuple 的帮助函数 std::get<N>(tp) 就能获取 tuple 中第 N 个元素.然而我们却不能直接在运行期通过变量来获取 ...
- 为什么String被设计为不可变?是否真的不可变?
1 对象不可变定义 不可变对象是指对象的状态在被初始化以后,在整个对象的生命周期内,不可改变. 2 如何不可变 通常情况下,在java中通过以下步骤实现不可变 对于属性不提供设值方法 所有的属性定义为 ...
- go语言笔记——数组长度不可变,但是元素值是可变的!!!
数组声明的格式是: var identifier [len]type 例如: var arr1 [5]int 在内存中的结构是: 对索引项为 i 的数组元素赋值可以这么操作:arr[i] = valu ...
随机推荐
- css解决多行溢出显示省略号
多行溢出 仅作为记录方便查找 display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: number; /*n行溢 ...
- 2018-08 【bug汇总】
1. 问题描述:更细参数时更新失败. 报错信息:无报错信息,返回为成功. 问题分析:代码查看逻辑无问题.说明可能不是逻辑的问题,dubug查看发现,参数并没有传入进来,查看传递参数的requestBe ...
- ASP.NET Web API相关
接收移动端上传的图片,示例代码: [HttpPost] [ApiSecurityFilter] public IHttpActionResult UploadImg() { string imgs = ...
- 使用vue-cli搭建项目
在使用vue-cli搭建项目前提: 1.node.js环境 2.npm镜像 开始. 1.cmd打开命令行, npm install -g vue-cli 进行全局安装 (vue-V可以查看其版本) ...
- VI操作
[[ 开头]] 结尾[[^ 开头第一个字符]]$ 结尾最后一个字符 以下转载自:http://www.cnblogs.com/88999660/articles/1581524.html 进入vi的 ...
- Anaconda安装(Windows)
Anaconda集成了python和各种常用工具. 目前有两个版本,分别包含了python2.7和python3.5,并且自动添加环境变量.去官网下载安装包. 1.安装其他模块.conda insta ...
- ubuntu mariadb installation
sudo apt-get install mariadb-server[sudo] password for wadmin: Reading package lists... DoneBuilding ...
- WEBBASE篇: 第十一篇, JavaScript知识6
JavaScript 知识6 一, String 对象 1,分隔字符串, 函数: split(seperator) 作用: 将字符串,通过seperator 拆分成一个数组: eg: var msg= ...
- hive 非等值连接, 设置hive为nonstrict模式
1 数据准备 create table stocks(id int, date string,price string, company string); insert into table stoc ...
- 搭建开发环境3) Debian8 安装Netbeans
1.下载最新版的Netbeans.sh(netbeans-8.2-linux.sh) 2.进入管理员账户,移动到下载的目录 ./netbeans-8.2-linux.sh //执行安装脚本 出现界面安 ...