传递列表同时保留原始列表
我正在自学Python,遇到了一个关于列表的问题。我想把一个列表传给我的函数,然后从中删除一些元素,但又想保留原来的列表。怎么才能让Python“实例化”传入的列表,而不是传递原列表的引用呢?
举个例子:
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]
谢谢!
7 个回答
6
有一种稍微更容易理解的方式来做同样的事情:
d = burninate(list(a))
在这里,list()
这个构造函数是用来根据a
创建一个新的列表的。
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]
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()或其他会修改参数的函数。例如:
def burninante(b):
return b[:-4:-1] # return the last three elements in reverse order