Передача списка при сохранении оригинала
Итак, я преподаю 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]
Спасибо!
Ответы
Ответ 1
Как и другие ответы, вы можете предоставить свою функцию копии списка.
В качестве альтернативы, ваша функция может взять копию аргумента:
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
Ответ 2
Вы можете вызвать 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]
Ответ 3
Несколько более читаемый способ сделать то же самое:
d = burninate(list(a))
Здесь конструктор list()
создает новый список на основе a
.
Ответ 4
Более общее решение было бы import copy
и использовать copy.copy()
для параметра.
Ответ 5
Другие версии:
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)]
Ответ 6
Вы можете использовать copy.deepcopy()
Ответ 7
burninate = lambda x: x[:-4:-1]