我有一个短脚本,应该是模拟一个堆栈。该脚本包含两个函数,一个用于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']
所以推是有效的,不是。但是我不知道从函数到全局变量的传递值有什么不同。你知道吗
谢谢
你不是在处理一个globals。您正在传入一个本地
l_in
,但在pop()
中,您将本地对象重新绑定到一个新的列表对象:l_in
是对全局l
所引用的同一可变列表对象的引用。你知道吗对于这个用例,列表有一个
.pop()
方法,删除最后一个元素。它将直接改变列表对象:另一种方法是分配给切片的列表,用新的列表索引替换列表中的所有索引:
这里甚至不需要
length
,因为负索引从末尾开始计算。0
也是可选的,将该条目留空也可以:最后一个选项是使用
del
删除特定索引:这也会删除最后一个元素。你知道吗
您正在编辑列表L,因此应该将其绑定到函数返回
这将确保L在函数调用后始终更新。 干杯
Push使用一个操作来改变列表
append
,但是pop将赋值给局部变量l_in = l_in[0:length-1]
。它创建一个新列表并将其分配给局部变量。你也需要为那个手术变异。例如del l_in[-1]
。你知道吗如果您不想使用Python提供的
pop()
方法,因为您正在进行实验并想编写自己的方法,那么等效函数可以是:我还假设您希望
pop()
函数返回弹出的值,而不是整个列表。你知道吗相关问题 更多 >
编程相关推荐