Передача списка с сохранением оригинала - PullRequest
12 голосов
/ 23 октября 2008

Так что я учу себя 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 ]

14 голосов
/ 23 октября 2008

Как и предлагали другие ответы, вы можете предоставить своей функции копию списка.

В качестве альтернативы ваша функция может получить копию аргумента:

def burninate(b):
    c = []
    b = list(b)
    for i in range(3):
        c.append(b.pop())
    return c

По сути, вы должны четко представлять себе (и документацию), будет ли ваша функция менять свои аргументы. По моему мнению, функции, которые возвращают вычисленные значения, не должны изменять свои аргументы, а функции, которые изменяют свои аргументы, не должны ничего возвращать. См. [] .Sort (), [] .extend (), {} .update () и т. Д. Для Python. Очевидно, есть исключения (например, .pop ()).

Кроме того, в зависимости от вашего конкретного случая, вы можете переписать функцию, чтобы избежать использования pop () или других функций, которые изменяют аргумент. например, * +1008 *

def burninante(b):
    return b[:-4:-1]   # return the last three elements in reverse order
10 голосов
/ 23 октября 2008

Вы можете позвонить 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]
6 голосов
/ 23 октября 2008

Немного более понятный способ сделать то же самое:

d = burninate(list(a))

Здесь конструктор list() создает новый список на основе a.

5 голосов
/ 23 октября 2008

Более общим решением было бы import copy и использование copy.copy() для параметра.

2 голосов
/ 23 октября 2008

Другие версии:

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)]
1 голос
/ 07 февраля 2009

Вы можете использовать copy.deepcopy ()

0 голосов
/ 23 октября 2008
burninate = lambda x: x[:-4:-1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...