Можно ли изменить список за пределами функции? - PullRequest
0 голосов
/ 22 апреля 2019

Мой профессор назначил проект, в котором мы выполняем серию изменений в списке.Нам предоставляется основная функция, такая как:

CURRENT_LIST = [1,2,3,4,5]

def main():
    data = list(CURRENT_LIST)
    shiftRight(data)
    print("After shifting data", data)

По сути, мы должны написать функции, которые обрабатывают эти функции, которые вызывает main().Я понимаю, как писать функции.Например, смещение всего вправо приведет к чему-то вроде:

def shiftRight(data:list) -> (list):
     data = data[-1:] + data[:-1]
     return(data)

Мой вопрос: возможно ли это сделать без изменения функции main(), которая нам была предоставлена?Насколько я понимаю, после вызова shiftRight() мне пришлось бы снова присвоить его списку.Что-то вроде:

   data = shiftRight(data)

Но основная функция, которая нам была предоставлена, настроена не так.Мне интересно, могу ли я переназначить список data без изменения функции main().Я также хотел бы избегать использования глобальных переменных, поскольку не думаю, что это было намерением моего профессора.

Он допустил ошибку в main(), который нам предоставили?Или действительно есть способ изменить этот список без использования global variables и без изменения main()?

Ответы [ 2 ]

1 голос
/ 22 апреля 2019

Вы можете изменить содержимое списка, это приведет к обновлению исходного списка, на который указывает переменная, вместо создания нового:

>>> l = list(range(10))
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> def shiftRight(l):
...     l[:] = l[-1:] + l[:-1]
... 
>>> shiftRight(l)
>>> l
[9, 0, 1, 2, 3, 4, 5, 6, 7, 8]
0 голосов
/ 22 апреля 2019

Функция main просматривает CURRENT_LIST, делает ее копию и затем вызывает эту копию data. Затем он передает data в функцию с именем shiftRight, которая принимает список и выполняет правый сдвиг в этом списке. Эта функция изменяет список на месте и возвращает None (что происходит по умолчанию, если вы пропустите оператор return). Затем main печатает результат.

def shiftRight..., который у вас есть, должен находиться вне функции main, сразу после присвоения CURRENT_LIST. Вам также нужно настроить эту функцию shiftRight, чтобы изменить переданный список, а не создавать и возвращать новый. Для этого попробуйте методы списка pop и insert.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...