首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么python dict对象会解开元组的一个独立元素,但如果这是一个列表对象,它就会将它保存在容器中?

Python中的字典(dict)是一种无序的键值对集合,其中的键是唯一的。当我们将一个元组作为字典的键时,Python会将元组解开,将元组中的每个元素作为独立的键。这是因为元组是不可变的,可以作为字典的键,而列表是可变的,不能作为字典的键。

下面是对这个问题的详细解答:

字典是Python中非常常用的数据结构,它可以存储键值对,并且可以通过键来快速访问对应的值。在Python中,字典是使用大括号{}来表示的,键和值之间使用冒号:进行分隔。

当我们将一个元组作为字典的键时,Python会将元组解开,将元组中的每个元素作为独立的键。这是因为元组是不可变的,可以作为字典的键。例如,我们可以这样定义一个字典:

代码语言:txt
复制
d = {('a', 'b'): 1, ('c', 'd'): 2}

在这个例子中,我们使用了两个元组作为字典的键,每个元组都有两个元素。当我们访问字典中的值时,可以通过元组的每个元素来获取对应的值:

代码语言:txt
复制
print(d[('a', 'b')])  # 输出 1
print(d[('c', 'd')])  # 输出 2

然而,如果我们将一个列表作为字典的键,Python会报错,提示列表是不可哈希的(unhashable)。这是因为列表是可变的,不能作为字典的键。例如,下面的代码会报错:

代码语言:txt
复制
d = {['a', 'b']: 1, ['c', 'd']: 2}  # 报错:TypeError: unhashable type: 'list'

如果我们需要使用可变的对象作为字典的键,可以考虑使用元组来代替列表。元组是不可变的,可以作为字典的键。如果需要存储多个值,可以将这些值放在元组中作为一个元素。

总结起来,Python中的字典会将元组解开,将元组中的每个元素作为独立的键,而列表是不可哈希的,不能作为字典的键。这是因为字典要求键是唯一的,并且可以通过键来快速访问对应的值。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Python 工匠:容器门道

一看到“容器”,大家想到多是那头蓝色小鲸鱼:Docker,这篇文章和它没有任何关系。本文里容器,是 Python 一个抽象概念,是对专门用来装其他对象数据类型统称。...在 Python ,有四类最常见内建容器类型: 列表(list)、 元组(tuple)、 字典(dict)、 集合(set)。通过单独或是组合使用它们,可以高效完成很多事情。...为我们提供了更好开发体验。 如果这是 Python 语言优势的话,为什么我们还要费劲去了解容器类型实现细节呢?答案是:关注细节可以帮助我们编写出更快代码。 写更快代码 1....如果有一天,我们拿到评论不再是被继续装在列表里,而是在不可变元组里呢?...别在循环体内修改被迭代对象 这是一个很多 Python 初学者错误。

74810

Python 工匠:容器门道

Python ,有四类最常见内建容器类型:列表(list)、元组(tuple)、字典(dict)、集合(set)。通过单独或是组合使用它们,可以高效完成很多事情。...为我们提供了更好开发体验。如果这是 Python 语言优势的话,为什么我们还要费劲去了解容器类型实现细节呢?答案是:关注细节可以帮助我们编写出更快代码。写更快代码1....这一切看上去很合理,因为我们接到最原始需求就是:“有一个 列表,里面...”。如果有一天,我们拿到评论不再是被继续装在列表里,而是在不可变元组里呢?...举个例子,在 Python 2 如果我们需要合并两个字典,需要这么做:def merge_dict(d1, d2): # 因为字典是可被修改对象,为了避免修改原对象,此处需要复制一个 d1...别在循环体内修改被迭代对象这是一个很多 Python 初学者错误。

52720
  • Python工匠:解析容器类型门道

    一看到“容器”,大家想到多是那头蓝色小鲸鱼:Docker,这篇文章和它没有任何关系。本文里容器,是 Python 一个抽象概念,是对专门用来装其他对象数据类型统称。...在 Python ,有四类最常见内建容器类型:列表(list)、元组(tuple)、字典(dict)、集合(set)。通过单独或是组合使用它们,可以高效完成很多事情。...为我们提供了更好开发体验。 如果这是 Python 语言优势的话,为什么我们还要费劲去了解容器类型实现细节呢?答案是:关注细节可以帮助我们编写出更快代码。 1....如果有一天,我们拿到评论不再是被继续装在列表里,而是在不可变元组里呢?...别在循环体内修改被迭代对象 这是一个很多 Python 初学者错误。

    78020

    Python 容器使用 5 个技巧和 2 个误区

    Python ,有四类最常见内建容器类型: 列表(list)、 元组(tuple)、 字典(dict)、 集合(set)。通过单独或是组合使用它们,可以高效完成很多事情。...我在前面给了“容器一个简单定义:专门用来装其他对象就是容器这个定义太宽泛了,无法对我们日常编程产生什么指导价值。...为我们提供了更好开发体验。 如果这是 Python 语言优势的话,为什么我们还要费劲去了解容器类型实现细节呢?答案是:关注细节可以帮助我们编写出更快代码。 写更快代码 1....这一切看上去很合理,因为我们接到最原始需求就是:“有一个 列表,里面...”。如果有一天,我们拿到评论不再是被继续装在列表里,而是在不可变元组里呢?...访问文章 Instagram 在 PyCon 2017 演讲摘要,搜索“迭代器”可以查看详细内容。 2. 别在循环体内修改被迭代对象 这是一个很多 Python 初学者错误。

    78530

    python学习总结

    Python基础 数据类型 python数据类型可以分为:字符串、布尔类型、整数、浮点数、数字、列表元组、字典和日期。...Python列表是基于PyListObject实现,PyListObject是一个变长对象,在内部通过一些方法维护列表地址,进行内存管理等实现列表功能。...元组Tuple 除了元组以外另一种有序表称为元组tuple,但是tuple一旦初始化便不能修改,在定义时,tuple元素就被确定了。为什么要引入tuple呢?...可变和不可变 综上所述,Python不可变对象有:字符串、整数、元组;可变对象有:列表,集合,字典。...迭代器不要求事先准备好整个迭代过程所有元素,迭代器仅在迭代到某个元素时才计算该元素,迭代器仅仅在迭代到某个元素时才计算该元素,在这之前或之后,元素可以不存在或者被销毁,这个特点使得迭代器特别适合用于遍历一些巨大或是无限集合

    1.1K50

    python 存储字典_python 字典存储

    广告  拿空间换时间字典-Python基础前传(9)  科学存在逻辑只有两个:  1.解释问题  2.解决问题  我们明白了科学逻辑,我们就能理解任何知识和技能  (一)Python为什么要有字典...查找速度非常快,一个元素和10W个元素没有什么区别。  字典无序特性和创建:  列表是有序对象结合,字典是无序对象集合。  字典当中元素是通过键来存取,每个键值(key=>val...  ... 表示该值是一个对象,且对其没有特别的操作  布尔类型(Boolean)  在Python,None、任何数值类型0、空字符串“”、空元组()、空列表[]、空字典{}都被当作F...  ...如果只是一些小数据,或者说关联性较强且存在存储后复用数据,我们该如何存储呢?  使用open保存文本  最简单、粗暴+无脑存储方式就是保存成一个文本文档了。使用open...  ...内存里面有一个数据结构,你希望将它保存下来,重用,或者发送给其他人。你怎么做?嗯, 这取决于你想要怎么保存,怎么重用,发送给谁。很多游戏允许你在退出时候保存进度,然后你再次启动时...

    2.7K30

    Python字典介绍

    因为你努力会使你变得更加优秀,同时你所结识圈子也不一样,当机会来临时你才能更好把握住。这就是大佬为什么越来越优秀,这本质上是一个良性循环过程。...01 代码块与笔记 字典 Dictionary 1 字典简介 字典是 Python 语言中唯一映射类型,是无序,具有极快查找速度,元素以键值对形式存在 字典对象是可变,它是一个容器类型...,能存储任意个数 Python 对象,其中也包括其他容器类型(列表元组) 格式:字典每个键值对(key=>value)用冒号 :分割,每个键值对之间用逗号 ,分割,整个字典包括在花括号 {}之... 2 常用操作 创建字典、增删改查、长度、遍历字典等 创建字典1 # 键特性:唯一 不可变对象 # 数字、字符串、元组等可以为键,列表不可以 # 重复时,后一个键值对覆盖前面的...print(dict1.keys()) # 以列表返回字典所有值 print(dict1.values()) # 以列表返回可遍历(键, 值) 元组数组 print(dict1.items

    85220

    Python字典及基本操作(超级详细)

    比如有份成绩表数据,语文:79,数学:80,英语:92,这组数据看上去像两个列表这两个列表元素之间有一定关联关系。如果单纯使用两个列表来保存这组数据,则无法记录两组数据之间关联关系。 ...程序既可使用花括号语法来创建字典,也可使用 dict() 函数来创建字典。实际上,dict 是一种类型,它就Python 字典类型。 ...需要指出是,元组可以作为 dict key,列表不能作为元组 key。这是由于 dict 要求 key 必须是不可变类型,列表是可变类型,因此列表不能作为元组 key。 ...在使用 dict() 函数创建字典时,可以传入多个列表元组参数作为 key-value 对,每个列表元组将被当成一个 key-value 对,因此这些列表元组都只能包含两个元素。...,当使用方括号语法访问并不存在 key 时,字典引发 KeyError 错误;如果使用 get() 方法访问不存在 key,该方法会简单地返回 None,不会导致错误。

    58920

    Python字典及基本操作(超级详细)

    比如有份成绩表数据,语文:79,数学:80,英语:92,这组数据看上去像两个列表这两个列表元素之间有一定关联关系。如果单纯使用两个列表来保存这组数据,则无法记录两组数据之间关联关系。...程序既可使用花括号语法来创建字典,也可使用 dict() 函数来创建字典。实际上,dict 是一种类型,它就Python 字典类型。...需要指出是,元组可以作为 dict key,列表不能作为元组 key。这是由于 dict 要求 key 必须是不可变类型,列表是可变类型,因此列表不能作为元组 key。...在使用 dict() 函数创建字典时,可以传入多个列表元组参数作为 key-value 对,每个列表元组将被当成一个 key-value 对,因此这些列表元组都只能包含两个元素。...,当使用方括号语法访问并不存在 key 时,字典引发 KeyError 错误;如果使用 get() 方法访问不存在 key,该方法会简单地返回 None,不会导致错误。

    1.8K10

    预备小菜:Python入门之数据结构

    Python中有四个内置数据结构(Built-in Data Structure):分别是列表list、元组tuple、字典dict、集合set,它们也是一个容器,里面存放数据。...,里面可以储存任意对象 元组元素是不可变、可重复 元组是有序,可以通过索引访问每个元素 简单理解元组就是一个固定列表,没有列表增加删除修改方法,只能查询。...那元组存在目的是什么呢?因为元组不可变,所以代码更安全。这就是跟Javafinal关键词修饰常量是一个效果。 问题:如果Tuple里元素包含list,那么list是可以修改吗?...集合Set 特点: 集合使用“{}”来表示,里面可以储存任意对象 集合元素是可变、不可重复,可以增加删除修改 元组是无序 Pythonset跟Javaset特点类似,都是不可重复,或者是存入重复对象只是保留一个...,update()新增时候,字符串会拆分成当个字符添加到set,也就是update进行将对象迭代添加,这样update()参数必须是一个可迭代对象

    66410

    盘一盘 Python 系列特别篇 - Collection

    引言 我们在【盘一盘 Python 下】一贴介绍过 5 种类型容器型(container)数据,分别是字符串(string)、列表(list)、元组(tuple)、字典(dictionary)和集合(...顾名思义,容器型就是将一组元素打包在一起。有人觉得字符串不是容器型数据,但我认为它将一个个字符(character)打包在一起,因此也算是容器型数据。...在读写字典时,如果键不存在会报错,那么就有了默认字典 (defaultdict)。 计数器 (Counter) 是个字典子类,能快速计量元素出现个数。...原来普通字典在读取不能记录放入元素顺序(现在可以了),那么就有了有序字典 (OrderedDict)。因此我觉得有序字典现在用处不大,还是讲讲吧。...,对于不存在键,一个默认值。

    52420

    Python教程第3章 | 集合(List列表、Tuple元组Dict字典、Set)

    这里你问,为什么是 2 ,不是 3 呢? 这是因为在编程世界,都是从 0 开始,而不是我们生活习惯从 1 开始。 所以需要知道第三个是谁? 那就是 name[2] 就可以了。...list.insert(index, obj) 将对象插入列表 list.pop(obj=list[-1]) 移除列表一个元素(默认最后一个元素),并且返回该元素值 list.remove(obj...这是因为括号 () 既可以表示元组(tuple),又可以表示数学公式小括号,这就产生了歧义。 所以如果只有一个元素时,你不加逗号,计算机就根本没法识别你是要进行整数或者小数运算还是表示元组。...字典)创建 字典是另一种可变容器模型,且可存储任意类型对象。...{} 6、 dict (字典)使用时注意事项 (1) dict (字典)是不允许一个键创建两次,但是在创建 dict (字典)时候如果出现了一个键值赋予了两次,以最后一次赋予值为准 例如:

    68210

    Python元组与字典

    python字典 概念:字典是另一种可变容器类型,且可存储任意类型对象,如其他容器类型。 字典由键和对应值成对组成。字典也被称作关联数组或哈希表。理解好一一对应 关系很重要 1....字典键特性 字典值可以没有限制地取任何python对象,既可以是标准对象,也可以是用户定义键不行。 两个重要点需要记住: 1)不允许同一个键出现两次。...1.11         clear():清除所有元素 例如: ? 2. 掌握字典遍历: ? 概念:Python元组列表类似,也是一种容器类型,不同之处在于元组元素不能修改。...元组使用小括号,列表使用方括号。 Python元组列表类似,不同之处在于元组元素不能修改。 特点:支持异构;   支持嵌套;   不可变 元组使用小括号,列表使用方括号。...复制 3 in (1, 2, 3) True 元素是否存在 for x in (1, 2, 3): print x, 1 2 3 迭代 ---- 元组索引,截取 因为元组也是一个序列,所以我们可以访问元组指定位置元素

    88410

    python核心知识汇总(精编版)

    列表元组 列表元组,都是一个可以放置任意数据类型有序集合。其中列表是动态,长度大小不固定,可以随意地增加、删减或者改变元素;而元组是静态,长度大小固定,无法增加删减或者改变。...Python 列表元组都支持负数索引,-1 表示最后一个元素,-2 表示倒数第二个元素,以此类推。...5]] # 列表一个元素也是一个列表 tup = ((1, 2, 3), (4, 5, 6)) # 元组一个元素也是一个元组 两者也可以通过 list() 和 tuple() 函数相互转换...对于容器,你可以很直观地想象成多个元素在一起单元;而不同容器区别,正是在于内部数据结构实现方法。 容器是可迭代对象,可迭代对象调用 iter() 函数,可以得到一个迭代器。...如何规避GIL影响: CPU密集可以使用多进程+进程池 IO密集使用多线程/协程 将关键性能代码放到C实现 为什么有了GIL还要关注线程安全:python只有原子操作是可以保证线程安全,即一个操作如果一个字节码指令可以完成就是原子

    1.4K10

    Python 数据类型

    即指向 ‘a’,就不能改成指向 ‘b’,指向一个 List,就不能改成指向其他对象指向这个 List 本身是可变!...如果 key 不存在直接报错:KeyError。...由于 Dcit 是按照 key 查找,所以,在一个 Dict ,key 不能重复。 Dict 存储 key-value 是没有顺序Dict 作为 key 元素必须是不可变。...复制 字符串、列表元组 in 3 in (1, 2, 3) True 元素是否存在 字符串、列表元组、字典、集合 not in 4 not in (1, 2, 3) True 元素是否不存在 字符串...、列表元组、字典 、集合 内置函数 Python 还有很多内置函数,这里我们介绍一些常用关于基本数据类型内置函数: 序号 方法 描述 1 cmp(item1, item2) 比较两个值 2

    61930

    Python入门之字典操作详解

    这篇文章主要介绍了Python 字典(Dictionary)详细操作方法,需要朋友可以参考下: Python字典是另一种可变容器模型,且可存储任意类型对象,如字符串、数字、元组等其他容器模型。...type' object is unsubscriptable 五、字典键特性 字典值可以没有限制地取任何python对象,既可以是标准对象,也可以是用户定义键不行。...():创建一个新字典,以序列seq中元素做字典键,val为字典所有键对应初始值 4、radiansdict.get(key, default=None):返回指定键值,如果值不在字典返回default...值 5、radiansdict.has_key(key):如果键在字典dict里返回true,否则返回false 6、radiansdict.items():以列表返回可遍历(键, 值) 元组数组 7...、radiansdict.keys():以列表返回一个字典所有的键 8、radiansdict.setdefault(key, default=None):和get()类似, 如果键不已经存在于字典

    1.1K140

    Python 列表元组、字典及集合操作

    , obj) #将对象插入列表 list.pop(obj=list[-1]) #移除列表一个元素(默认最后一个元素),并且返回该元素值 list.remove(obj)     #移除列表某个值一个匹配项...三、字典 字典是另一种可变容器模型,且可存储任意类型对象,如字符串、数字、元组等其他容器模型 字典在其他语言中也称为map,使用键-值(key-value)存储,具有极快查找速度 字典中键是唯一如果重复最后一个键值对替换前面的...>>> dict2['Beth'] '9102' >>> dict2['Beth1'] # 如果字典没有的键访问值,输出以下错误 Traceback (most recent call last...(key, default=None) #和get()类似, 如果键不已经存在于字典,将会添加键并将值设为default dict.update(dict2)    ...#把字典dict2键/值对更新到dictdict.values()        #以列表返回字典所有值 四、集合 集合(set)是一个无序不重复元素序列。

    1.4K10

    Python学习笔记04-基础篇—元组、集合与字典

    如果元组直接或间接地包含了可变对象,那么它就不能用作关键字。列表不能用作关键字,因为列表可以通过索引、切片或 append() 和 extend() 之类方法来改变。...理解字典最好方式,就是将它看做是一个 键: 值 对集合,键必须是唯一(在一个字典)。一对花括号可以创建一个空字典:{} 。...如果你使用了一个已经存在关键字来存储值,那么之前与这个关键字关联值就会被遗忘。用一个存在键来取值则会报错。...key in dict 如果键在字典dict里返回true,否则返回false items() 以列表返回可遍历(键, 值) 元组数组 keys() 返回一个迭代器,可以使用 list() 来转换为列表...setdefault(key, default=None) 和get()类似, 如果键不存在于字典,将会添加键并将值设为default update(dict2) 把字典dict2键/值对更新到

    79410

    关于Python变量,我就说一句话

    在电脑上执行下,看看和你想是否一样? 一种很常见错误,就是觉得 team 这里列表(list)里是三个独立字典(dict对象。然而看了输出你就会发现,列表三个元素长得一样。...而且,如果你之后再更改任何一个 name 或 id 属性,另外两个也跟着变。 ? 为什么这样?...在某些语言中,变量确实像一个容器”,你定义了某种类型变量,就给你分配好这个容器,之后你给变量赋值,就像是往容器里装入不同内容,容器还是那个容器,不会变。...你创建3个容器,赋给一样值,他们也还是3个独立容器。 但在 Python ,这个理解是错误!...Python 变量像是一个“标签”,你给一个变量赋值,就是把这个标签贴在一个对象上;重新赋值,就是撕下标签帖到另一个对象上。你给3个变量赋给一样值,就相当于把3个标签贴在同一个对象上。

    46330

    常见Python知识点汇总(一)

    部分内容收集于网络~ dict 字典 python字典实现也是一个列表。是key-value结构。 Pythondict和set为什么是无序?...为什么不是所有的python对象都可以用作dict键和set元素 要弄懂上面的问题,我们首先要了解Python内部是如何实现dict和set类型。...我们先来看看dict内部结构,dict其实本质上是一个列表(散列表即总有空白元素数组,Python保证至少有三分之一数组元素是空),dict每个键都占用一个表元,而一个表元又分为两个部分...关于为什么dict是无序,这个是因为python内部会保证散列表至少有三分之一位置为空,当我们增加元素时候,python有可能会对散列表进行扩容,具体操作就是重新开辟一块更大空间,将原有的元素添加到新表里面...如果函数收到一个不可变对象(比如数字、字符或者元组引用,就不能直接修改原始对象--相当于通过“传值’来传递对象

    16040
    领券