Discuss / Python / 练习演示

练习演示

Topic source

leaf_wan

#1 Created at ... [Delete] [Delete and Lock User]

s1 = (1,2,3) s2 = (1,[2,3])

d['s']=s1 d['s'] 输出:(1,2,3)

d['s']=s2 d['s'] 输出:(1,[2,3])

s = set (s1) s 输出:(1,2,3)

s= set (s2) 输出:报错

还是不太明白 为什么最后报错了

似乎我没有理清楚,可变和不可变之与 dict set list 关系

Delta-C

#2 Created at ... [Delete] [Delete and Lock User]

set的原理和dict一样,同样不可以放入可变对象. 要创建一个set,需要提供一个list作为输入集合 s2 = (1,[2,3]) s= set (s2) 也就是 s= set (1,[2,3]) 1不是个list 应该是这样吧

汪大骆

#3 Created at ... [Delete] [Delete and Lock User]

s1和s2都是元组(tuple),元组是不可变的。 但是包含可变对象,比如list,虽然元组定义后指向不变,指向该list,但是list本身的内容可以变,所以s2体现为“可变”。 而dict,set都要求key为不可变对象,所以s1可以作为key,而使用s2时会报错。 这是我的理解,不知道有没有把话说清楚。

黑版大熊

#4 Created at ... [Delete] [Delete and Lock User]

创建一个set有三种方式: 一: s=set([key1,key2]) 二: s=set((key1,key2)) 三: s={key1,key2} 请亲自试验 可尝试按 『曾小果』 所说的方式理解理解。

Ziege5

#5 Created at ... [Delete] [Delete and Lock User]

题主好!廖大神的意思很明白。首先你应该把两个元组分别作为字典的键而不是值定义字典。所以题主的以下代码键和值搞反了,你换一下试试,会有不一样的结果: """ >>>d['s']=s1

>>>d['s']

(1,2,3) d['s']=s2
d['s']
(1,[2,3])

"""

关于下面的问题:

s = set (s1) s 输出:(1,2,3)

s= set (s2) 输出:报错


廖大神说了,set集合当中的元素实际就是字典当中的key,两者在python设计之初就决定了他们都不可变,所以set中的元素只能用不可改写的字符串,整数,元组等数据类型。但是元组可以包含可变的列表作为元素,所以如果你的元组当中包含列表这种可变的数据类型作为元素,当它作为字典的key或者集合的元素时,字典的key和集合的元素就不能哈希了,就会报错


  • 1

Reply