从函数到全局的Python变量

2024-04-25 01:48:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个短脚本,应该是模拟一个堆栈。该脚本包含两个函数,一个用于push,另一个用于pop操作。每个操作调用一次函数。你知道吗

我的问题是,显然对于pop函数,堆栈的全局变量不会被pop函数的输出更新,我只是不明白为什么会这样,因为push函数工作得很好,而且对我来说,pop函数的工作方式类似。你知道吗

我已经研究了其他线程,这些线程讨论了如何用函数的返回值实例化全局变量,这些函数是以可行函数作为参数调用的,但显然我遗漏了一些东西。你知道吗

有人能指出我的脚本的问题吗?我对在局部变量和全局变量之间传递值的误解是什么?你知道吗

这是我的剧本:

l = []

def push(l_in,a):
    l_in.append(a)
    l_out = l_in
    print l_out
    return l_out


def pop(l_in):
    length = len(l_in)
    if length == 0:
        print []
    else:
        l_in = l_in[0:length-1]
    print l_in
    return l_in

但对于这个请求:

push(l,'a')
push(l,'b')
push(l,'c')
pop(l)
pop(l)
pop(l)

我得到这个输出:

['a']
['a', 'b']
['a', 'b', 'c']
['a', 'b']
['a', 'b']
['a', 'b']

所以推是有效的,不是。但是我不知道从函数到全局变量的传递值有什么不同。你知道吗

谢谢


Tags: 函数in脚本return堆栈def方式out
3条回答

你不是在处理一个globals。您正在传入一个本地l_in,但在pop()中,您将本地对象重新绑定到一个新的列表对象:

l_in = l_in[0:length-1]

l_in是对全局l所引用的同一可变列表对象的引用。你知道吗

对于这个用例,列表有一个.pop()方法,删除最后一个元素。它将直接改变列表对象:

l_in.pop()

另一种方法是分配给切片的列表,用新的列表索引替换列表中的所有索引:

l_in[:] = l_in[0:length-1]

这里甚至不需要length,因为负索引从末尾开始计算。0也是可选的,将该条目留空也可以:

l_in[:] = l_in[:-1]

最后一个选项是使用del删除特定索引:

del l_in[-1]

这也会删除最后一个元素。你知道吗

您正在编辑列表L,因此应该将其绑定到函数返回

l = push(l,'a')
l = push(l,'b')
l = push(l,'c')
l = pop(l)
l = pop(l)
l = pop(l)

这将确保L在函数调用后始终更新。 干杯

Push使用一个操作来改变列表append,但是pop将赋值给局部变量l_in = l_in[0:length-1]。它创建一个新列表并将其分配给局部变量。你也需要为那个手术变异。例如del l_in[-1]。你知道吗

如果您不想使用Python提供的pop()方法,因为您正在进行实验并想编写自己的方法,那么等效函数可以是:

def pop(l_in):
    if len(l_in) == 0:
        return []
    else:
        ret = l_in[-1]
        del l_in[-1]
    return ret

我还假设您希望pop()函数返回弹出的值,而不是整个列表。你知道吗

相关问题 更多 >