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

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

Спасибо!

stackoverflow.com/questions/184643/…
Andrea Ambu 07.02.2009 14:08

Трогдор, сжигаю свои данные !!!

Kevin Panko 02.12.2009 01:09
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
12
2
376
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Вы можете вызвать 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 () не должно вызывать никаких проблем.

John Fouhy 23.10.2008 03:03
Ответ принят как подходящий

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

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

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 ()

Другие вопросы по теме