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

2025-02-08 08:52:00
admin
原创
39
摘要:问题描述:我在很多地方都看到对 s 进行切片赋值的使用list。我能够理解它在与(非默认)索引一起使用时的用法,但我无法理解它的用法,例如:a_list[:] = ['foo', 'bar'] 这与a_list = ['foo', 'bar'] ?解决方案 1:a_list = ['foo', 'bar'] ...

问题描述:

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

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

这与

a_list = ['foo', 'bar']


解决方案 1:

a_list = ['foo', 'bar']

在内存中创建一个新的list并将名称指向它。之前指向a_list什么并不重要。a_list

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

调用以a为索引,以内存中新建的a为值的对象__setitem__的方法。a_list`slice`list

__setitem__评估slice以确定它代表什么索引,并调用iter传递的值。然后它迭代对象,将 指定范围内的每个索引设置为slice对象的下一个值。对于lists,如果 指定的范围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不是 1,则可迭代对象必须具有正确的长度:

>>> 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. 右侧的对象没有指向任何名称。如果没有其他引用它(例如,当它是文字时,如您的示例中所示),则在迭代完成后,它将被引用计数为不存在。

解决方案 2:

差别相当大!

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

解决方案 3:

通过赋值给a_list[:]a_list仍然引用同一个列表对象,但内容已修改。通过赋值给a_lista_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则保持其原始值。

解决方案 4:

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)
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用