2016-10-18 4 views
0

Допустим, у нас есть функция foo()Как мы можем имитировать пропуск по ссылке в python?

def foo(): 
    foo.a = 2 

foo.a = 1 
foo() 

>> foo.a 
>> 2 

Является ли это вещий или я должен обернуть переменную в изменяемые объекты, такие как список?

Например:

a = [1] 

def foo(a): 
    a[0] = 2 
foo() 

>> a 

>> 2 
+1

Какова ваша цель? Вы хотите изменить объект в области вызова? В глобальном масштабе? Что-то другое? –

+0

Я хочу изменить переменную так, чтобы изменения выполнялись и в глобальной области. Кроме того, я не совсем понимаю, что означает 'function_name.a' (например, 1) и почему он имитирует изменяемый объект? – yask

+0

Также проверьте это: http://stackoverflow.com/questions/39975659/python-27-how-to-fix-store-a-value-to-a-method-to-preserve-its-interface/39975900#39975900 – jbndlr

ответ

1

Поскольку вы «хотите мутировать переменную так, что изменения осуществляются в глобальном масштабе, а также» использовать global ключевое слово, чтобы рассказать свою функцию, что имя a является глобальной переменной. Это означает, что любое присвоение a внутри вашей функции влияет на глобальную область действия. Без назначения объявления globala в вашей функции будет создана новая локальная переменная.

>>> a = 0 
>>> def foo(): 
...  global a 
...  a = 1 
... 
>>> foo() 
>>> a 
1 
+0

Можете ли вы также объяснить, что означает 'foo.a', где' foo' - это имя функции. Как пример 1 (как упоминается в вопросе) работает как изменяемая переменная? – yask

+0

@yask: функции Python являются вызываемыми объектами. Поскольку они являются объектами, вы можете добавлять атрибуты с помощью точечной нотации (например, 'foo.a = 2'). Это законная, но не распространенная практика (но не совсем необычная). Если вам нужно связать поведение с состоянием, то вы хотите объявить класс. –

+0

@StevenRumbalski '' a'' в вашем примере не является атрибутом, это может ввести в заблуждение. – jbndlr

0

Использование класса (может быть немного Overkill):

class Foo: 
    def __init__(self): 
     self.a = 0 

def bar(f): 
    f.a = 2 

foo = Foo() 
foo.a = 1 
bar(foo) 
print(foo.a) 
+0

Я предполагаю, что вы имели в виду 'self.a = 0' в' Foo .__ init__'? –

+0

Исправить. Исправление моего кода сейчас. – Oxben