8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

对整个列表进行切片赋值和直接赋值有什么区别?

mvdn 2月前

53 0

我在很多地方都看到对列表使用切片赋值。我能理解它在与(非默认)索引一起使用时的用法,但我无法理解它的用法,例如:a_list[:] = ['foo', ...

我在很多地方都看到对 s 进行切片赋值的使用 list 。我能够理解它在与(非默认)索引一起使用时的用法,但我无法理解它的用法,例如:

a_list[:] = ['foo', 'bar']

这与

a_list = ['foo', 'bar']

帖子版权声明 1、本帖标题:对整个列表进行切片赋值和直接赋值有什么区别?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由mvdn在本站《list》版块原创发布, 转载请注明出处!
最新回复 (0)
  • a_list = ['foo', 'bar']
    

    创建一个新的 list 并将名称指向 a_list 之前指向 a_list 什么并不重要

    a_list[:] = ['foo', 'bar']
    

    以切片 __setitem__ 索引, a_list 以内存中创建的新切片作为值 slice list __setitem__

    __setitem__ 评估 slice 以确定它代表什么索引,并调用 iter 传递的值。然后它迭代对象,将 指定范围内的每个索引设置为 slice 对象的下一个值。对于 list s,如果 指定的范围 slice 与可迭代对象的长度不同,则 list 调整 的大小。这允许您执行许多有趣的操作,例如删除列表的部分:

    a_list[:] = [] # deletes all the items in the list, equivalent to 'del a_list[:]'
    

    或者在列表中间插入新值:

    a_list[1:1] = [1, 2, 3] # inserts the new values at index 1 in the list
    

    但是,对于 \'扩展切片\',其中 step 不是一,所以可迭代对象必须具有正确的长度:

    >>> lst = [1, 2, 3]
    >>> lst[::2] = []
    Traceback (most recent call last):
      File "<interactive input>", line 1, in <module>
    ValueError: attempt to assign sequence of size 0 to extended slice of size 2
    

    切片分配的主要不同之处 a_list 在于:

    1. a_list 必须已经指向一个对象
    2. 该对象被修改,而不是指向 a_list 一个新对象
    3. 该对象必须 __setitem__ 支持 slice 索引
    4. 右边的对象必须支持迭代
    5. 右侧的对象没有指向任何名称。如果没有其他引用它(例如,当它是文字时,如您的示例中所示),则在迭代完成后,它将被引用计数为不存在。
  • 我在文档中读到了这一点(docs.python.org/tutorial/introduction.html#lists)。只是默认索引让我怀疑 :)

  • \'对于列表,如果切片指定的范围与可迭代对象的长度不同,则列表的大小会进行调整。\' 仅当范围的步长值为 1 时,这才是正确的。对于除 1 以外的步长值,分配的可迭代对象必须产生正确数量的项目。

  • @SvenMarnach 谢谢。我把它加在最后,因为我忘了提到它,而且我知道在某些情况下它必须是相同的长度。

  • 差别相当大!

    a_list[:] = ['foo', 'bar']
    

    您修改了与名称 绑定的现有列表 a_list 。另一方面,

    a_list = ['foo', 'bar']
    

    为该名称分配一个新列表 a_list .

    也许这会有所帮助:

    a = a_list = ['foo', 'bar'] # another name for the same list
    a_list = ['x', 'y'] # reassigns the name a_list
    print a # still the original list
    
    a = a_list = ['foo', 'bar']
    a_list[:] = ['x', 'y'] # changes the existing list bound to a
    print a # a changed too since you changed the object
    
  • 通过分配 a_list[:] , a_list 仍引用同一列表对象,但内容已修改。通过分配 a_list , a_list 现在引用新列表对象。

    查看其 id

    >>> a_list = []
    >>> id(a_list)
    32092040
    >>> a_list[:] = ['foo', 'bar']
    >>> id(a_list)
    32092040
    >>> a_list = ['foo', 'bar']
    >>> id(a_list)
    35465096
    

    正如您所见,它 id 不会随着切片分配版本而改变。


    两者之间的不同可能会导致截然不同的结果,例如当列表是函数的参数时:

    def foo(a_list):
        a_list[:] = ['foo', 'bar']
    
    a = ['original']
    foo(a)
    print(a)
    

    与此同时, a 也被修改了,但如果 a_list = ['foo', 'bar'] 被使用, a 则保持其原始值。

  • a_list = ['foo', 'bar']
    a=a_list[:]  # by this you get an exact copy of a_list 
    print(a)
    a=[1,2,3] # even if you modify a it will not affect a_list
    print(a)
    print(a_list)
    
  • 问题是询问如何将 ['foo', 'bar'] 分配给 a_list[:]。

返回
作者最近主题: