Итак, я учу себя 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]
Спасибо!
Трогдор, сжигаю свои данные !!!






Вы можете вызвать 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]
Чуть более читаемый способ сделать то же самое:
d = burninate(list(a))
Здесь конструктор list() создает новый список на основе a.
Другие версии:
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)]
Более общим решением было бы использование import copy и использование параметра copy.copy().
Если вы ожидаете чего-то подобного списку, то просто использовать list () не должно вызывать никаких проблем.
Как предлагали другие ответы, вы можете предоставить своей функции копию списка.
В качестве альтернативы ваша функция может принимать копию аргумента:
def burninate(b):
c = []
b = list(b)
for i in range(3):
c.append(b.pop())
return c
По сути, вы должны четко представлять себе (и в своей документации), изменит ли ваша функция свои аргументы. На мой взгляд, функции, возвращающие вычисленные значения, не должны изменять свои аргументы, а функции, которые изменяют свои аргументы, не должны ничего возвращать. См. Примеры [] .sort (), [] .extend (), {} .update () и т. д. В python. Очевидно, есть исключения (например, .pop ()).
Кроме того, в зависимости от вашего конкретного случая, вы можете переписать функцию, чтобы избежать использования pop () или других функций, которые изменяют аргумент. например
def burninante(b):
return b[:-4:-1] # return the last three elements in reverse order
burninate = lambda x: x[:-4:-1]Вы можете использовать copy.deepcopy ()