Python: переменные по ссылкам (взломать) - PullRequest
1 голос
/ 29 сентября 2011

Есть ли способ (взломать), чтобы заставить функцию Python (def) возвращать результаты по ссылке даже для неизменяемых типов?

Приложение заявки (замена в качестве подпрограммы):
def swap(a, b):<br> .....a,b = b,a

Примечание:
def swap(a, b):<br> .....return b,a
работает как функция, которая является не ответом на вопрос!


Например, есть функция random.перемешать (а), который работает на месте.Моя идея - вызвать функцию, написанную на Fortran / C ++, и вызвать их через Python.Это работает, но имеет и недостатки.
note:
И "lambda", и "def" (как функция) имеют следующую проблему: a, b = swap(a, b), которая требует заботы о порядке переменных.В моем предложении (если это было возможно) подпрограмма используется как: swap(a, b) , поэтому нет необходимости заботиться о порядке переменной .

Ответы [ 3 ]

4 голосов
/ 29 сентября 2011

Все имена в Python являются ссылками.И нет, нет доступных ссылок (например, в смысле C ++).Вам нужно передать изменяемый объект, а затем вы можете изменить его в функции.Но опять же, возвращение новых значений должно быть предпочтительным способом.

3 голосов
/ 29 сентября 2011

Нет, таких вещей не существует, потому что вы получаете данный объект в качестве ссылки, но если вы переназначите его, он не будет изменен обратно.

В этом случае вам также придется работать с изменяемым контейнером (список, dict, объект с атрибутами).

2 голосов
/ 29 сентября 2011

В питоне нет способа передать "указатель записи".Вы можете передать объект и имя (так, чтобы вызываемый мог использовать, например, setattr), или вы можете передать список и индекс.Не существует такого понятия, как не зависящий от контекста «адрес модифицируемой ячейки» ... есть только имена или индексы, которым, однако, также необходим контекст (какое пространство имен, какой массив).

В общем случаеесли вам действительно нужно передать указатель записи, решение в Python - передать функцию «установщик», которую вызывающий может использовать для установки значения.

Например:

def foo(setter):
    setter(42)

def bar():
    x = [1,2,3,4]

    def setFirst(value):
        x[0] = value

    foo(setFirst)

    print x[0] # --> 42
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...