2015-12-06 2 views
0

Я думаю, что понимаю, почему глобальные переменные должны использоваться для связывания переменных и с функциями. Поэтому, если я позвоню:Назначение глобальных переменных в python для одной переменной или функции?

x = 0 
    y = 0 
    z = 0 

    def example(): 
     global x 
     global y 
     global z 

Я буду в состоянии изменить x, y, z, которые находятся вне функции.

Однако есть ли способ присвоить все мои необходимые глобальные переменные чему-то еще, а затем вызвать их в одной строке.

Я пробовал:

def global_var(): 
    global x 
    global y 
    global z 

, а затем вызова:

def example(): 
    global_var() 
    x += 1 
    etc 

Но это не похоже на работу. или, по крайней мере, код, по-видимому, соответствует первой переменной x и генерирует ошибку перед присваиванием.

ответ

1

ключевое слово global имеет область видимости метода, поэтому, когда вы вызываете его внутри global_var(), они будут доступны для модификаций внутри него. Однако, когда вы вернетесь из него в пример(). Ваш глобальный эффект больше не действует, потому что x только для чтения, и вы не можете изменить его значение. Вы должны избавиться от gloval_var()

def example(): 
    global x 
    global y 
    global z 
    x += 1 

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

my_vars = {'x':0, 'y':0, 'z':0} 
def example(): 
    my_vars['x'] += 1 

В этом случае для словаря не требуется ключевое слово global для модификации. Причина этого в том, что вы не назначаете новое значение, а только модифицируете существующий объект. Если вы напишете x += 2, это означает x = x + 2, что приведет к новому присвоению, которое приведет к x, указывая на другое значение, и это невозможно без global. Однако, если вы изменяете my_vars, его адрес памяти остается неизменным, но только его данные изменяются, так как dict является изменяемым значением.

+0

Ах право, значения связаны между собой, называет глобальное только в целом более неэффективным? И поэтому значения словаря постоянно обновляются таким образом. Как и в дальнейшем, если I cal my_vars ["x"] + = 2, будет x теперь равным трем (используя пример выше). –

+0

Да, вам не нужно вызывать глобальные словари. Эффективность должна быть тривиальной, так что оба случая, вероятно, не повлияют на вычисления, но качество кода будет лучше во втором случае. Я обновил ответ, чтобы немного объяснить, почему словарь не нужен глобальный. –

+0

Большое спасибо. Большая помощь. –

0

Вы можете создать функцию, которая изменяет глобальные переменные:

x = 0 
y = 0 
z = 0 

def setGlobals(**vals): 
    for key, value in vals.iteritems(): 
     globals()[key] = value 

print x, z 
setGlobals(x=5, z=3) 
print x, z 

выход:

0 0 
5 3 
Смежные вопросы