Python分配给切片还是从末尾删除?

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

假设我们要创建所有长度为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)
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]
    的倒数。您没有将其重新指定为要保留的所有元素的切片,而是将空指定给要删除的切片

它打印什么?中间输出与您预期的有什么不同?