2010-09-06 3 views
2

IMO питон передача по значению, если параметр основные типы, такие как числа, булевоPython: как передать ссылку на функцию

func_a(bool_value): 
    bool_value = True 

не изменит внешний bool_value, верно?

Так что мой вопрос, как я могу сделать bool_value изменение вступает в силу во внешнем (один пройти по ссылке?

+0

Вы не можете. (и это дополнение для минимальной длины комментария SO SO) –

+0

Зачем вы хотите? Каков контекст, который запрещает вам просто возвращать значение? – detly

ответ

4

Вы можете использовать список, чтобы заключить Inout переменным:

def func(container): 
    container[0] = True 


container = [False] 
func(container) 
print container[0] 

Вызова по значению/звонок по ссылке неправильное слово - старая дискуссия. Семантика Python более точно описывается путем совместного использования CLU. См Fredrik Lundh напишем об этом подробнее:

+0

Если вы используете только контейнер для этой цели, нет необходимости проверять 'container [0]'.пустой 'container' для false и вставьте что-нибудь в него для true, а затем просто проверьте контейнер непосредственно. – aaronasterling

+0

Конечно, но я не знаю вариант использования OP из вопроса. Я просто показываю один возможный сценарий; надеюсь, общий метод достаточно ясен. – ars

2

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

Как это:.

def add1(my_list): 
    my_list.append(1) 

a = [] 
add1(a) 
print a 

Но, если вы my_list = [1], вы получите новый экземпляр, теряя первоначальную ссылку в функция, поэтому вы не можете просто «my_bo» ол = False»и надеюсь, что вне этой функции переменный получают Ложные

3

Python (всегда), как Java (в основном) передает аргументы (и, в простого присваивания, связывает имена) путем ссылки на объект. Не существует понятия «передать по значению», и никакая концепция «ссылки на переменные» - это только ссылка на значение (некоторые выражают это, говоря, что у Python нет есть «переменные» .. . Он имеет имена, которые привязаны к значениям - и это все, что может когда-либо произойти).

Mutable objects могут иметь мутирующие методы (некоторые из которых выглядят как операторы или даже назначение, например a.b = c фактически означает type(a).__setattr__(a, 'b', c), который вызывает метод, который может быть мутирующим).

Но простое присвоение имени bar (и передача аргументов, точно такое же, как простое присвоение имени baren) никогда не имеет что-либо вообще, чтобы сделать какие-либо мутирующие методы.

Совершенно независимо от используемых типов, простое присвоение имени barename (и, аналогично, передача аргументов) связывает или восстанавливает только определенное имя слева от =, никогда не затрагивая никакое другое имя или какой-либо объект каким-либо образом. Вы очень ошибочно, если вы считаете, что типы имеют какое-либо отношение к семантике передачи аргументов (или, что то же, простое присвоение именам).

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