所以我在教自己Python,我遇到了列表问题.我想传递我的函数列表并在保留原始列表的同时弹出项目.如何使python"instance"成为传递的列表,而不是将指针传递给原始列表?
例:
def burninate(b):
c = []
for i in range(3):
c.append(b.pop())
return c
a = range(6)
d = burninate(a)
print a, d
Run Code Online (Sandbox Code Playgroud)
输出:[0,1,2] [
5,4,3 ] 期望输出:[0,1,2,3,4,5] [5,4,3]
谢谢!
Joh*_*uhy 14
正如其他答案所示,您可以为您的函数提供列表的副本.
作为替代方案,您的函数可以获取参数的副本:
def burninate(b):
c = []
b = list(b)
for i in range(3):
c.append(b.pop())
return c
Run Code Online (Sandbox Code Playgroud)
基本上,你需要在脑海中(以及在你的文档中)清楚你的功能是否会改变它的论点.在我看来,返回计算值的函数不应该更改它们的参数,并且更改其参数的函数不应返回任何内容.有关示例,请参阅python的[] .sort(),[] .extend(),{}.update()等.显然有例外(如.pop()).
此外,根据您的具体情况,您可以重写该函数以避免使用pop()或其他修改参数的函数.例如
def burninante(b):
return b[:-4:-1] # return the last three elements in reverse order
Run Code Online (Sandbox Code Playgroud)
mha*_*wke 10
您可以burninate()使用列表的副本进行调用,如下所示:
d = burninate(a[:])
要么,
d = burninate(list(a))
另一种方法是在方法中复制列表:
def burninate(b):
c=[]
b=b[:]
for i in range(3):
c.append(b.pop())
return c
>>> a = range(6)
>>> b = burninate(a)
>>> print a, b
>>> [0, 1, 2, 3, 4, 5] [5, 4, 3]
Run Code Online (Sandbox Code Playgroud)
一个稍微更易读的方法来做同样的事情是:
d = burninate(list(a))
Run Code Online (Sandbox Code Playgroud)
在这里,list()构造函数基于创建一个新列表a.