python - Python分配给切片vs从末尾删除?
问题描述
想象一下,我们想要创建所有长度为 5 的列表,这些列表[0, -1]
以 3 个整数开始和结束,这些整数都是 2 或 3。一个这样的列表(8 个可能的列表)是[0, -1, 2, 2, 3]
. 这是一些简单的(错误的)递归代码:
def op(a):
print(a)
if(len(a) < 5):
a.append(2)
op(a)
print("pre 2", a)
a = a[:-1] #.pop()
print("post 2", a)
if(len(a) < 5):
a.append(3)
print("pre 3", a)
op(a)
print("post 3", a)
a = a[:-1] #.pop()
op(a)
print(a)
但是,此代码不起作用并输出一些随机列表。但是,如果我们用 替换该行a = a[:-1]
,a.pop()
它完全可以正常工作。为什么有区别?
解决方案
a = a[:-1]
创建一个新的列表对象并将其重新绑定到 namea
。所有引用该名称的先前堆栈条目a
都将引用原始的、未截断的列表。a.pop()
执行删除最后一个元素的就地操作。它不会改变名称a
所指的内容。所有堆栈条目都将引用截断列表。
在不重新绑定名称的情况下删除最后一个元素的其他方法是
a[:] = a[:-1]
. 这将获取新列表并将a[:-1]
其分配给.a
请记住,表单a[x] = y
调用的任何表达式type(a).__setitem__(a, x, y)
,这通常是对 的就地操作a
,同时完全a = x
重新绑定名称a
。del a[-1]
. 这相当于调用type(a).__delitem__(a, -1)
. 同样,就地操作非常类似于pop
除了它不返回元素。a[-1:] = []
. 这有点像 的倒数a[:] = a[:-1]
。与其作为要保留的所有元素的切片辞职,不如将空分配给要删除的切片。
推荐阅读
- python - 如何通过dict \ df在一个列上用条件替换列列表
- python - Python 线程不运行
- sql - 最大和分组依据
- robotframework - 使用 Pabot 运行多个套件时无法合并机器人框架的重新运行失败报告
- c# - 使用 ScrollViewer 从中心原点缩放和平移图像在 UWP 中不起作用
- ios - 使用 IOS 13 编译的应用程序的 IOS14 跟踪权限
- java - 如何在 Java 中访问嵌套的 Json 数组数据
- python - 如何删除熊猫数据框中的某些字符串
- java - java.util.EmptyStackException 运行时错误
- javascript - 如何创建从 Firebase 读取数据然后在 twilio 上发送消息的计划函数