2013-09-11 2 views
0

Как вы знаете, в C/C++, я могу вернуть указатель на функцию, и использовать его в качестве левого значения, как показано ниже:Как вернуть левое значение в функции Python?

typedef char* (*func)(char *); 

char* foo(char *a) { 
    return &a[0]; 
} 

char* foo2(char *a) { 
    return &a[1]; 
} 

void goo(func f, char* a) { 
    f(a)[0] = 10; 
} 

int main(void) { 
    char a[6] = {'a', 'b', 'c', 'd', 'e', 'f'}; 
    goo(foo, a); 
} 

Как я могу сделать это в Python (возвращает значение левого в Python)?

def foo(a): 
    return a 

def foo2(a): 
    return a[0, :] 

import numpy as np 
p = np.random.rand(5, 2) 

foo(p)[0,:] = [1,2] # ok 
foo2(p) = [1, 2] # error 
print p 

Почему хорошо и ошибка в моем коде ??

+0

Строки Python не изменяются; вы можете возвращать * изменчивые * объекты из функции и использовать их как цели назначения просто отлично (если 'f' возвращает' list', то 'f() [0] = 1' присваивает' 1' первому элементу из этот возвращенный список). Чего вы пытаетесь достичь? –

ответ

1

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

a = [None] 

def foo(): 
    return a 

foo()[0] = "hello" 

print(a) # prints "hello" 

Однако это не обязательно идиоматических Python: функции Python обычно передавать объекты вокруг вместо буферов памяти, так что может быть лучший способ решить вашу актуальную проблему. Он также не может напрямую подражать вашим функциям foo и foo2. Есть способы сделать это, но они, как правило, даже уродливее, чем предыдущий фрагмент кода.

Смежные вопросы