2013-09-19 3 views
0

У меня есть эта функция:функция Python, перезаписать оригинальную переменную

def icaocode(code): 
    c.execute("SELECT ICAO, LAT, LON FROM airports WHERE ICAO = ?", (code,)) 
    result = c.fetchone() 
    if result is None: 
     print("No airport found with ICAO code", code) 
     sys.exit() 
    else: 
     print("Found", code) 
     [...] 

позволяет сказать, что я называю эту функцию с

icaocode(x) 

Как получить функцию перезаписи х с результатами?

+3

У вас нет. Python передается по значению. – geoffspear

+0

Что это будет? Похоже, код будет тем же значением ... – thegrinner

+2

Почему бы просто не вернуть результаты и не переписать x в вызывающей функции? – mtahmed

ответ

5

В функции DEF:

def icaocode(code): 
    ... 
    return code # new value 

При вызове:

x = icaocode(x) 

Btw если аргумент изменяемые (как список), вы можете перезаписать его без возврата новый стоимость. Если он неизменен (как строка, целое число), вы не можете.

E.g.

def f(some_list): 
    some_list.append("something") 

В этом случае

my_list = [] 
f(my_list) 

my_list будет ["something"]

+0

Doh ... Почему я не подумал об этом. Благодаря! – Caesius

1

Вы можете, но это ужасный способ ведения бизнеса. Верните значение вместо этого, помните, что вы можете вернуть более одного значения, если хотите. Однако есть один способ вернуть значение через параметр. Но не используйте его.

>>> def a(b): 
...  b[0] = 'hi' 
.... 
>>> c = ['nono'] 
>>> a(c) 
>>> print(c) 
['hi'] 
+4

Какой интерпретатор Python вы используете, который преобразует «привет» в «hej»? :-) – Cucu

+2

@Cucu: Я всегда в последний и самый большой, на этот раз это какой-то тип модуля IKEA. Переводит все на шведский. –

+2

@Cucu: Мне просто нужно было его реализовать, было слишком весело не делать. [Исходный код] (https://gist.github.com/highfestiva/6634748). ;) –

2

Вы не можете перезаписать значение параметра. То есть вы не можете изменить его, чтобы ссылаться на другой объект. Однако вы можете изменить объект. В Python есть старая нить на основе пропущенных значений и семантики pass-by-reference в Python: https://stackoverflow.com/a/986145/399047

Например, вы можете добавить элементы в список, который передается как параметр. Следующий код:

def func(a_list): 
    a_list.append("some value") 

l = [1,2,3] 
print l 
func(l) 
print l 

даст:

[1,2,3] 
[1,2,3,"some value"] 

В отличие от этого, строка, не может быть изменен. Следующий код:

def func2(a_str): 
    a_str += "suffix" 

s = "test" 
print s 
func2(s) 
print s 

даст:

"test" 
"test" 

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

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

def icaocode(code_list): 
    input_code = code_list[0] 
    [...] 
    # do something to input_code, assign result to 
    # output_code 
    [...] 
    code_list[0] = output_code 

Тогда вы могли бы назвать с:

code_list = [code] 
icaocode(code_list) 

Тем не менее, этот код уродливый мне, пахнет что-то ужасное, и я не рекомендую.

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