Подтвердить что ты не робот

Передача списка при сохранении оригинала

Итак, я преподаю 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]

Спасибо!

4b9b3361

Ответ 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]