Python - 从函数到全局的变量

时间:2014-04-27 15:19:51

标签: python

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

我的问题是,显然对于pop函数,堆栈的全局变量不会被pop函数的输出更新,我只是不明白为什么会这样,因为push-function工作正常并且对我而言,pop-function看起来像是以类似的方式运作。

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

有些机构能否指出我的脚本问题以及我对在本地变量和全局变量之间传递值的误解是什么?

所以这是我的剧本:

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']

所以推动工作,不是流行。但是我并不认为在将值从函数传递给全局变量方面有什么不同。

由于

3 个答案:

答案 0 :(得分:1)

你没有处理全局变量。您正在传递本地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]

也会删除最后一个元素。

答案 1 :(得分:0)

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()函数返回弹出的值,而不是整个列表。

答案 2 :(得分:0)

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

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

这将确保在函数调用后L始终更新。 欢呼声