Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python使用等号比较2个列表和2个元组_Python_Python 3.x_List_Hash_Tuples - Fatal编程技术网

Python使用等号比较2个列表和2个元组

Python使用等号比较2个列表和2个元组,python,python-3.x,list,hash,tuples,Python,Python 3.x,List,Hash,Tuples,最近,我学习了更多关于Python中哈希的知识,我在这里谈到: 假设一个Python程序有两个列表。如果我们需要考虑 比较这两个列表,你会怎么做?比较每个元素? 嗯,这听起来很简单,但也很慢 Python有一种更聪明的方法来实现这一点。当构造元组时 在程序中,Python解释器计算其内存中的哈希值。如果 比较发生在两个元组之间,它只是比较散列 价值观,它知道它们是否相等 所以我真的对这些说法感到困惑 首先,当我们这样做时: [1,2,3]=[1,2,3]那么这个等式是如何工作的呢?它是否计算哈希

最近,我学习了更多关于Python中哈希的知识,我在这里谈到:

假设一个Python程序有两个列表。如果我们需要考虑 比较这两个列表,你会怎么做?比较每个元素? 嗯,这听起来很简单,但也很慢

Python有一种更聪明的方法来实现这一点。当构造元组时 在程序中,Python解释器计算其内存中的哈希值。如果 比较发生在两个元组之间,它只是比较散列 价值观,它知道它们是否相等

所以我真的对这些说法感到困惑

首先,当我们这样做时:
[1,2,3]=[1,2,3]
那么这个等式是如何工作的呢?它是否计算哈希值,然后进行比较

第二,我们这样做有什么区别:

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

因为当我试图用timeit查找执行时间时,我得到了以下结果:

$ python3.5 -m timeit '[1, 2, 3] == [1, 2, 3]'
10000000 loops, best of 3: 0.14 usec per loop
$ python3.5 -m timeit '(1, 2, 3) == (1, 2, 3)'
10000000 loops, best of 3: 0.0301 usec per loop

那么,为什么列表的
0.14
与比列表快的元组的
0.03
在时间上存在差异呢

以下是演示的示例:

>>> l1=[1,2,3]
>>> l2=[1,2,3]
>>> 
>>> hash(l1) #since list is not hashable
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> t=(1,2,3)
>>> t2=(1,2,3)
>>> hash(t)
2528502973977326415
>>> hash(t2)
2528502973977326415
>>> 
l1=[1,2,3] >>>l2=[1,2,3] >>> >>>散列(l1)#因为列表不可散列 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:不可损坏的类型:“列表” >>>t=(1,2,3) >>>t2=(1,2,3) >>>散列(t) 2528502973977326415 >>>散列(t2) 2528502973977326415 >>> 在上面的例子中,当您在列表上调用hash时,它会给您TypeError,因为它是不可哈希的,并且为了两个列表的相等性,python检查它的内部值,这将花费很多时间

对于tuple,它计算散列值,对于具有相同散列值的两个相似tuple,python只比较tuple的散列值,因此它比list快得多

从给定的文章

Python有一种更聪明的方法来实现这一点。当构造元组时 在程序中,Python解释器计算其内存中的哈希值。如果 比较发生在两个元组之间,它只是比较散列 价值观,它知道它们是否相等


嗯,你困惑的一部分是你正在读的博客文章是错误的。关于很多事情。试着忘记你曾经读过它(除了记住网站和作者的名字,这样你就知道以后要避免读它们)

元组是可散列的,列表不是,这是事实,但这与它们的平等性测试函数无关。当然,“它只是比较散列值,它知道它们是否相等!”散列冲突会发生,忽略它们会导致可怕的错误,幸运的是Python的开发人员没有那么愚蠢。事实上,Python在初始化时计算散列值甚至不是真的*

元组和列表之间实际上有一个显著的区别(在CPython中,从3.6开始),但通常没有多大区别:列表在开始时会额外检查长度不相等,作为一种优化,但同样的检查结果是元组的悲观化,**因此从那里删除了它

另一个更重要的区别是源代码中的元组文本被编译成常量值,相同元组文本的单独副本被折叠成相同的常量对象;由于显而易见的原因,列表中不会出现这种情况

事实上,这正是您使用
timeit
测试的内容。在我的笔记本电脑上,比较元组需要95ns,而比较列表需要169ns,但如果将其分解,实际上比较需要93ns,再加上创建每个列表需要额外的38ns。为了进行公平的比较,您必须将创建移动到设置步骤,然后比较循环中已经存在的值。(当然,你可能不想说得公平,因为你发现了一个有用的事实,即每次使用一个元组常量而不是创建一个新列表时,你都节省了一微秒的重要部分。)


除此之外,他们基本上做同样的事情。翻译成类似Python的伪代码(并删除所有错误处理,以及使相同函数适用于@Romankonova的
可能重复的内容。我认为上下文不同,因此不会重复这一点。列表的公平比较不使用列表的哈希,在所有列表都不可哈希后,我建议不要再阅读该博客作者的任何内容,因为se这是胡说八道。OP知道这句话——他们甚至在问题中引用了这句话。为什么这会回答他们的问题?@MrT抱歉,但没有得到uHi,谢谢你的回答。我不知道为什么我会被否决,但我想这是我对列表和元组的混淆。所以我只想问:
当元组在程序中构造时,Python在terpreter在其内存中计算其哈希值。
这句话对元组正确吗?它比较哈希值并返回答案?@ShashankSharma不,它比较哈希值并返回答案是不对的。它所做的基本上就是我在答案中显示的。事实上,Python在co计算哈希值甚至是不对的指令时间并将其缓存;我也会将其编辑到答案中。解释得很好,感谢问题链接,这确实帮助我理解为什么他们没有在元组上实现哈希。解析得很好,答案很棒!
for i in range(min(len(v), len(w))):
    if v[i] != w[i]:
        break
else:
    return len(v) == len(w)
return False
if len(v) != len(w):
    return False
for i in range(min(len(v), len(w))):
    if v[i] != w[i]:
        break
else:
    return True
return False