所以我在教自己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
输出:[0,1,2] [5,4,3]
期望的输出:[0,1,2,3,4,5] [5,4,3]
谢谢!
答案 0 :(得分:14)
正如其他答案所示,您可以为您的函数提供列表副本。
作为替代方案,您的函数可以获取参数的副本:
def burninate(b):
c = []
b = list(b)
for i in range(3):
c.append(b.pop())
return c
基本上,你需要在脑海中(以及在你的文档中)清楚你的功能是否会改变它的论点。在我看来,返回计算值的函数不应该更改它们的参数,并且更改其参数的函数不应返回任何内容。有关示例,请参阅python的[] .sort(),[] .extend(),{}。update()等。显然有例外(如.pop())。
此外,根据您的具体情况,您可以重写该函数以避免使用pop()或其他修改参数的函数。 e.g。
def burninante(b):
return b[:-4:-1] # return the last three elements in reverse order
答案 1 :(得分: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]
答案 2 :(得分:6)
执行相同操作的稍微更易读的方法是:
d = burninate(list(a))
此处,list()
构造函数基于a
创建新列表。
答案 3 :(得分:5)
更通用的解决方案是import copy
,并在参数上使用copy.copy()
。
答案 4 :(得分:2)
其他版本:
def burninate(b):
c = []
for i in range(1, 4):
c.append(b[-i])
return c
def burninate(b):
c = b[-4:-1]
c.reverse()
return c
总有一天你会喜欢列表理解:
def burninate(b):
return [b[-i] for i in range(1,4)]
答案 5 :(得分:1)
您可以使用copy.deepcopy()
答案 6 :(得分:0)
burninate = lambda x: x[:-4:-1]