代码之家  ›  专栏  ›  技术社区  ›  Roman Odaisky

list()与python3.5中的iterable解包+

  •  6
  • Roman Odaisky  · 技术社区  · 6 年前

    两者之间有实际的区别吗 list(iterable) [*iterable] 在支持后者的Python版本中?

    4 回复  |  直到 6 年前
        1
  •  4
  •   Stefano Sanfilippo    6 年前

    list(x) [*x] 是一个表达式。你可以重新分配 list ,并让它做其他事情(但你不应该)。

    说到cPython, b = list(a)

    LOAD_NAME                1 (list)
    LOAD_NAME                0 (a)
    CALL_FUNCTION            1
    STORE_NAME               2 (b)
    

    c = [*a]

    LOAD_NAME                0 (a)
    BUILD_LIST_UNPACK        1
    STORE_NAME               3 (c)
    

    所以你可以这么说 [*a] 可以

        2
  •  3
  •   Graipher    6 年前

    dis

    import dis
    
    def call_list(x):
        return list(x)
    
    def unpacking(x):
        return [*x]
    
    dis.dis(call_list)
    #   2           0 LOAD_GLOBAL              0 (list)
    #               2 LOAD_FAST                0 (x)
    #               4 CALL_FUNCTION            1
    #               6 RETURN_VALUE
    
    dis.dis(unpacking)
    #   2           0 LOAD_FAST                0 (x)
    #               2 BUILD_LIST_UNPACK        1
    #               4 RETURN_VALUE
    

    所以有一个区别,它不仅仅是加载全局定义的名称 list ,这不需要在拆包时发生。所以它归结为 列表 BUILD_LIST_UNPACK 做。

    def list_comp(x):
        return [a for a in x]
    
    dis.dis(list_comp)
    #   2           0 LOAD_CONST               1 (<code object <listcomp> at 0x7f65356198a0, file "<ipython-input-46-dd71fb182ec7>", line 2>)
    #               2 LOAD_CONST               2 ('list_comp.<locals>.<listcomp>')
    #               4 MAKE_FUNCTION            0
    #               6 LOAD_FAST                0 (x)
    #               8 GET_ITER
    #              10 CALL_FUNCTION            1
    #              12 RETURN_VALUE
    
        3
  •  0
  •   Chris_Rands    6 年前

    [*iterable] 任务类 语法,不像 list(iterable) :

    >>> [*[]] = []
    >>> list([]) = []
      File "<stdin>", line 1
    SyntaxError: can't assign to function call
    

    你可以阅读更多关于这个 here

    你也可以使用 list(sequence=iterable) ,即使用关键字参数:

    >>> list(sequence=[])
    []
    

    阿盖恩 not useful .

        4
  •  0
  •   Dimitris Fasarakis Hilliard    6 年前

    实际的 . 这两个表达式都接受iterable,遍历它,然后从中创建一个列表。

    list 可以反弹到另一个名称; list(it) [*it] 是一个列表显示; [*它] [*它] 少了三次按键。

    但是这些实用吗?当我试着从iterable中得到一个列表时,我会想到它们吗?好吧,也许是为了不超过79个字符而击键让林特闭嘴。

        5
  •  0
  •   Roman Odaisky    5 年前

    显然,在CPython中有一个性能上的差异 [*a] 没有: What causes [*a] to overallocate?