2015-07-29 5 views
-1

Так что у меня есть что-то вроде этого:Python: импортировать глобальную переменную в локальную переменную, а затем снова экспортировать в глобальную переменную

var1 = 6 
var2 = 8 
def somefunction(thing): 
    thing += 1 

Теперь я хочу сделать так, чтобы somefunction(var1) на самом деле делает var1 равной 7 глобально , Я огляделся, и я не могу найти подходящего способа сделать это. Я толстый? Извините, если это очевидно, я только начал изучать Python пару дней назад. Благодарю.

@edit Хорошо, ответил. По-видимому, это невозможно сделать так, как я хотел. Ну что ж.

ответ

1

Просто somefunction()возвращение новое значение:

def somefunction(thing): 
    return thing + 1 

var1 = somefunction(var1) 

Вы не можете изменить другие ссылки на значения; вы передаете значение, а не имя. thing: 6 в вашем примере, а не var1.

Вы можете использовать словарь вместо имен, но вам все равно придется пройти в имени, а не переменная:

namespace = { 
    'var1': 6, 
    'var2': 8, 
} 

def somefunction(thing): 
    namespace[thing] += 1 

somefunction('var1') 

Теперь мы называть какой ключ в глобальном словаре изменять, а не передавать значение, которое ссылается на этот ключ. Вы можете сделать то же самое с помощью словаря globals(), но тогда вы рискуете случайно изменить глобальные переменные за пределами своего ограниченного набора имен, которые вы хотите обработать таким образом.

В этом контексте вы можете прочитать отличный Python Names and Values blogpost от Ned Batchelder.

+0

Но так, что я на самом деле эта вещь настроить это функции, вложенные в функции, и я не могу предсказать, что будет поставлен в том, где и этот путь вы описанное не реально. Разве я не могу сделать это изнутри функции? – frhrpr

+0

@frhrpr: do * what * от функции? Установить произвольные глобальные переменные на основе значения, которое вы передали? Нет, потому что значения не отслеживают, какие ссылки на них. –

+1

@frhrpr Похоже, у вас есть проблема с дизайном – IanAuld

0
var1 = 6 

def somef() 
    global var1 
    var1+= 1 
+0

Итак, как бы OP изменил 'var2'? Есть причина, по которой они хотели передать аргумент 'var1'. –

+1

OP ничего не говорил о var2, не так ли? – Jeremy

+0

Итак, почему вы думаете, что они упомянули «var1» и «var2» и переданы в «var1» в качестве аргумента? –

0

В Python нет возможности переназначить переменную в вызывающем абоненте внутри вызываемой функции.

var1 = 6 

def cant_be_done(v): 
    v += 1 

cant_be_done(var1) 
assert var1 == 6 

Более подробно о том, почему, см Python Names and Values

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