GeezerVisonThe World Wide Web, restored to 800 pixels of glory. | ||||||||||||||||||
| Home|About|Gaming cabinet|Archives|How it works|Starter sites | ||||||||||||||||||
GeezerVison is showing notes.kamacoder.com — Python列表和元组的区别:可变性、哈希、内存占用与使用场景 # Python列表和元组有什么区别?面试官问:“Python中的列表和元组有什么区别?” 很多录友答完“列表可变、元组不可变”就停了。面试官接着问一句“那元组一定能当字典键吗”“元组里放列表,列表能改吗”,答案就开始含糊。这道题的关键是讲清不可变到底约束了什么,以及它怎样影响哈希、内存和使用场景。可变与不可变的通用规则见《Python中的可变对象和不可变对象有什么区别?》。 # 简要回答列表 这个区别带来几个直接结果。元组的元素都可哈希时,元组本身才可哈希,可以作为字典键或集合元素;列表永远不可哈希。在CPython中,元组没有为扩容预留空间,同样元素数量下通常比列表占用更少内存。 语义上,列表适合放数量会变化的同类数据,例如用户列表;元组适合放结构固定的一组值,例如坐标、数据库的一行记录、函数返回的多个值。 # 详细回答# 原地修改与创建新对象列表的 1 2 3 4 5 6 7 8 9
# 元组不可变,不等于里面的对象不可变元组只保证每个位置保存的引用不变,不管被引用的对象自己能不能变: 1 2 3 4 5 6 7
图里要区分两层:元组这一层的“槽位引用”被锁死,替换会报错;槽位指向的列表那一层仍然可变, # 内存占用与性能在CPython中,列表为了让 1 2 3 4
但不要把“元组更快”当成换掉列表的理由。两者按下标访问都是O(1),真实程序的耗时通常不在这里。先按语义选类型,再考虑这点性能差异。 # 怎么选
一个实用的判断方法:如果每个位置都有固定含义(第0位是姓名,第1位是年龄),用元组;如果每个元素地位相同、数量会变,用列表。字典键要用复合值时,例如 # 知识拓展面试官可能追问: Q1:函数 返回的是一个元组,括号可以省略,真正构成元组的是逗号。调用方写 Q2:只有一个元素的元组怎么写? 要写成 Q3: 不会。转换只创建一个新的元组容器,元素引用和原列表里的完全相同。原列表中如果有嵌套列表,转换后它依旧是同一个可变列表,修改会同时体现在原列表和新元组里。 Q4:元组
评论验证登录状态... | ||||||||||||||||||
| You are visitor 01402520 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |