Python 奇怪的答案(具有计数功能的元组和列表)

乘风 python 201

原文标题Python Weird Answer (Tuples and List with count function)

这是下面给出的代码。

      k = [1,8,15] 
      g = (x for x in k if k.count(x)>0) 
      k = [2,8,22]
      print(list(g))

我得到的输出是 [8] 但它应该是 [1,8,15],对吧?因为每个元素至少出现一次。

对答案有任何合理的解释吗?

原文链接:https://stackoverflow.com//questions/71477431/python-weird-answer-tuples-and-list-with-count-function

回复

我来回复
  • user2357112 supports Monica的头像
    user2357112 supports Monica 评论

    那是生成器表达式。它创建了一个生成器,而不是一个元组。

    在 genexp 创建时,只计算生成器表达式的一部分。就是这部分:

    g = (x for x in k if k.count(x)>0)
    #               ^
    

    其他一切,包括这部分:

    g = (x for x in k if k.count(x)>0)
    #                    ^
    

    被懒惰地评估。

    这意味着你循环的k是原始的k,但k你调用的counton是新的k

    2年前 0条评论
  • Shawn Chang的头像
    Shawn Chang 评论

    这是通过在生成器表达式中打印xk来查看哪个k使用原始/修改列表的技巧:

    1stk指的是原始列表:

    >>> k = [1,8,15]
    >>> g = (x for x in k if (print(x) == None and k.count(x)>0))
    >>> k = [2,8,22]
    >>> list(g)
    1
    8
    15
    

    第2k指修改后的列表:

    >>> k = [1,8,15]
    >>> g = (x for x in k if (print(k) == None and k.count(x)>0))
    >>> k = [2,8,22]
    >>> list(g)
    [2, 8, 22]
    [2, 8, 22]
    [2, 8, 22]
    
    2年前 0条评论