所以我在自学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
期望输出: 0,1,2,3,4,5
谢谢!
发布于 2008-10-22 23:00:38
正如其他答案所建议的那样,您可以向您的函数提供列表的副本。
另一种方法是,您的函数可以获取参数的副本:
def burninate(b):
c = []
b = list(b)
for i in range(3):
c.append(b.pop())
return c
基本上,你需要在你的头脑中(和你的文档中)清楚你的函数是否会改变它的参数。在我看来,返回计算值的函数不应更改其参数,而更改其参数的函数不应返回任何内容。参见python的[].sort(),[].extend(),{}.update()等。显然,也有例外(比如.pop())。
此外,根据您的特定情况,您可以重写函数以避免使用pop()或其他修改参数的函数。例如:
def burninante(b):
return b[:-4:-1] # return the last three elements in reverse order
发布于 2008-10-22 22:42:33
您可以使用列表的副本调用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]
发布于 2008-10-22 22:45:14
要做同样的事情,一种更具可读性的方法是:
d = burninate(list(a))
在这里,list()
构造函数基于a
创建一个新列表。
https://stackoverflow.com/questions/227790
复制相似问题