Python分配给切片还是从末尾删除?
假设我们要创建所有长度为5的列表,以Python分配给切片还是从末尾删除?,python,list,recursion,slice,Python,List,Recursion,Slice,假设我们要创建所有长度为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
[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)
def op(a):
印刷品(a)
如果(len(a)<5):
a、 附加(2)
执行部分(a)
打印(“前2”,a)
a=a[:-1]#.pop()
打印(“post 2”,a)
如果(len(a)<5):
a、 附加(3)
打印(“前3”,a)
执行部分(a)
打印(“post 3”,a)
a=a[:-1]#.pop()
执行部分(a)
印刷品(a)
但是,此代码不起作用,并输出一些随机列表。但是,如果我们将a=a[:-1]
行替换为a.pop()
,它就可以完全正常工作。为什么会有差异?
创建一个新的列表对象,并将其重新绑定到名称a=a[:-1]
。所有先前引用名称a
的堆栈项都将引用原始的不受信任列表a
执行删除最后一个元素的就地操作。它不会更改名称a.pop()
所指的内容。所有堆栈条目都将引用被截断的列表a
。这将获取新列表a[:]=a[:-1]
,并将其分配给a[:-1]
的元素。请记住,a
形式的任何表达式都调用a[x]=y
,这通常是对type(a)。\uuu setitem\uuuu(a,x,y)
的就地操作,而a
则完全重新绑定名称a=x
a
。这相当于调用dela[-1]
。同样,一个就地操作与类型(a)。\uu delitem\uu(a,-1)
非常相似,只是它不返回元素pop
。这是a[-1:][]
的倒数。您没有将其重新指定为要保留的所有元素的切片,而是将空指定给要删除的切片a[:]=a[:-1]