Discuss / Python / 为什么只有一个元素?

为什么只有一个元素?

Topic source

diska本尊

#1 Created at ... [Delete] [Delete and Lock User]
 >>> lhf1 = (1,2,3)   
>>> lhf2 = (1,[2,3])    //定义两个列表
>>> len(lhf2)
2
>>> len(lhf1)
3                        //查看列表中有几个元素
>>> a = {lhf1}
>>> a
{(1, 2, 3)}
>>> len(a)
1                        //把lhf1列表元素赋给dict列表a,查看a列表里面有一个元素,为啥嘞?
>>> a = {lhf2}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
                        //把lhf2列表元素赋给dict列表a,赋值失败,因为lhf2里面有list列表不能被hash允许?
>>> b = ([lhf1])
>>> b
[(1, 2, 3)]
>>> len(b)
1                        //把lhf1列表元素赋给set列表b,里面只有一个元素,为啥嘞?
>>> b = ([lhf2])
>>> len(b)
1
>>> b
[(1, [2, 3])]            //把lhf2列表元素赋给set列表b,里面也只有一个元素,为啥嘞?
是不是我定义列表的时候有问题?需要list()或者是tuple()来定义?

diska本尊

#2 Created at ... [Delete] [Delete and Lock User]
>>> lhf1
(1, 2, 3)
>>> lhf2
(1, [2, 3])
>>> b  = set([lhf1])
>>> b
{(1, 2, 3)}
>>> b  = set([lhf2])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

刚刚发的有错误,b赋值没加set, 有list列表的都不能加在dirt或者set列表里。 但为什么没lis列表的都变成了一个元素呢?

汪大骆

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

我觉得你可以先用type()把每个变量类型搞清楚,另外那个变量a应该就是tuple类型,虽然打印出来是:{(1,2,3)},看起来不是很清楚它的类型。

1.对于>>> a = {lhf1} ,其实对应的实际操作是 >>> a = {lhf1:“空对象”},而a是一个字典,很明显a里面只有一个键值对 2.对于第二个问题,是由于你>>> b = ([lhf1])也没有加set,所以len()返回也是1.....你可以加上set再计算下长度,我自己测试过返回是3

首先要先告诉你,你的lhf1和lhf2都是tuple类型的,都是不可变类型,但你的lhf2里的第二个元素是个list,这是个可变类型。
其次就是你的赋值语句“a={lhf1}”,这是直接赋值语句,那么问题来了,这个a是dict类型还是set类型呢?答案显而易见,因为有{}的不是dict就是set,而二者最大的区别就是set没有value值,正如你的赋值语句写的那样并没有在后面写上value的值,所以程序就判断a是一个set类型,事实上用type(a)也验证了这点。因为之前说到了你这句赋值语句是直接赋值,相当于java里的初始化一样,显式的给了a值了,如int [] word = {a,b,c};你说说这个word数组len是几?答案是3,那么改成int[] num = {a};呢,len是几?答案是1,所以,和你的a = {jhf1}一样,长度是1,如果你将这句话改成a = {jhf1,jhf3},那么它的len肯定就是2了(注意这里的lhf3里的元素千万不要是(1,2,3),因为这样的话会和jhf1重复,长度结果还是1)可能你想问如果我想看到len=3该如何做呢,很简单,将a = {jhf1}改成a = set(jhf1)即可。
最后就是你那句“b = set([jhf1])”,其实这句话和“b = {jhf1}”是一样的效果,后者是显式赋值,而前者呢,jhf1本身就是一个tuple(你也可以理解成list)了,你又加了个[],说明你又把本身是tuple(或者list)又放在了一个list中,而如果想输出正确的结果应该这样写“b = set(jhf1)”即去掉[]。

  • 1

Reply