Передача указателя на список в Python - PullRequest
4 голосов
/ 24 декабря 2011

Есть ли способ передать указатель на список, чтобы я мог иметь update_list(list, data)

Вместо необходимости делать list = update_list(list, data)

Независимо от того, возможно ли это, чтоЖелательно и Pythonic в этой ситуации?

Ответы [ 5 ]

10 голосов
/ 24 декабря 2011

Я рекомендую прочитать Семантика имен переменных Python с точки зрения C ++ :

Все переменные являются ссылками

Это упрощение всей статьи, но это (и понимание того, что list является изменяемым типом) должно помочь вам понять, как работает следующий пример.

In [5]: def update_list(lst, data):
   ...:     for datum in data:
   ...:         lst.append(datum)
   ...:         

In [6]: l = [1, 2, 3]

In [7]: update_list(l, [4, 5, 6])

In [8]: l
Out[8]: [1, 2, 3, 4, 5, 6]

Вы можете даже сократить это, используя метод extend ():

In [9]: def update_list(lst, data):
   ...:     lst.extend(data)
   ...:       

Что на самом деле, вероятно, устраняет необходимость вашей функции.

N.B: list является встроенным и, следовательно, неправильным выбором имени переменной.

3 голосов
/ 24 декабря 2011

Вы не передаете указатели в Python. Просто назначьте фрагмент, который является целым списком

def update_list(list, data):
    list[:] = newlist
1 голос
/ 24 декабря 2011

Помимо учета того, что list является изменяемым и что вы можете изменить его на месте внутри других функций, как уже было указано в других ответах; если вы пишете много update_list методов, вы должны рассмотреть, является ли сохраняемые данные на самом деле не списком, а чем-то еще, что вписывается в модель, которую вы создали, как часть объектно-ориентированного подхода к проблеме.

Если это так, то непременно создайте свой собственный класс и методы для предоставления интерфейса, который вам необходим для внутреннего состояния вашего объекта:

class MyList(list):
    def update(self, data):
        # Whatever you need to update your data

...

my_list = MyList()
my_list.update(data)
1 голос
/ 24 декабря 2011

Конечно, просто убедитесь, что вы используете правильные имена переменных (list - это тип):

>>> def update_list(lst):
...   lst.append('hello')
... 
>>> a = []
>>> update_list(a)
>>> a
['hello']
>>>

Я не большой поклонник изменения вещей на месте, и я бы предпочел второй метод по сравнению с первым.

0 голосов
/ 24 декабря 2011

Этот вопрос StackOverflow и последующий принятый ответ проведут вас в правильном направлении к пониманию Pythonic того, что Python делает со значениями, переданными в.

В общем, Pythonic способобновить список будет писать / звонить update_list(list, data).

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