当我学习列表方法时,我在列表切片a[:]上try 了这些代码:

a = list('zyx')
a[:].pop()
print(a)

a = list('zyx')
a[:].append('o')
print(a)

a = list('zyx')
a[:].clear()
print(a)

a = list('zyx')
a[:] = []
print(a)

我得到的结果是:

['z', 'y', 'x']
['z', 'y', 'x']
['z', 'y', 'x']
[]

让我感到困惑的是,List方法和重新分配都更改了列表切片,但为什么重新分配会影响原始列表,而List方法不会?

我知道这可能是关于肤浅的抄袭,但我不能确切地说出原因.

推荐答案

理解下面的方法可能是成功的关键:

表达式中使用的片(如a[:])调用list.__getitem__(slice(None, None)),其中None, None是片的开始和结束.

对具有切片的列表调用__getitem__将返回由该切片组成的新列表对象(浅副本).这意味着a[:].anything()将对创建的临时新列表进行操作.

等于(a[:] = value)左侧的切片调用list.__setitem__(slice(None, None), value).换句话说,它修改了现有的列表--这是你通常会想到的.

正如@jasonharper所指出的,在没有另一个引用的情况下修改新的临时切片会令人困惑,而且用处不是很大;这也是造成这种不对称的另一个原因.

Python相关问答推荐

在IIS中运行的FastAPI-获取权限错误:[Win错误10013]试图以其访问权限禁止的方式访问插槽

查找3D数组中沿一个轴的相同值序列的长度(与行程长度编码相关)

如何从不同长度的HTML表格中抓取准确的字段?

在Python中根据id填写年份系列

customtkinter中使用的这个小部件的名称是什么

无法导入已安装的模块

使用Python Cerberus初始化一个循环数据 struct (例如树)(v1.3.5)

如何使用Tkinter创建两个高度相同的框架(顶部和底部)?

过载功能是否包含Support Int而不是Support Int?

Python主进程和分支进程如何共享gc信息?

由于瓶颈,Python代码执行太慢-寻求性能优化

Python中的函数中是否有充分的理由接受float而不接受int?

三个给定的坐标可以是矩形的点吗

为什么我的Python代码在if-else声明中的行之前执行if-else声明中的行?

如何从在虚拟Python环境中运行的脚本中运行需要宿主Python环境的Shell脚本?

我如何使法国在 map 中完全透明的代码?

Python中绕y轴曲线的旋转

所有列的滚动标准差,忽略NaN

启动带有参数的Python NTFS会导致文件路径混乱

为什么np. exp(1000)给出溢出警告,而np. exp(—100000)没有给出下溢警告?