Як выкарыстоўваць глабальныя зменныя ў функцыі пітона?

Як усталяваць глабальную зменную ўнутры функцыі пітона?

17

7 адказы

To use global variables inside a function, you need to do global inside the function, like so.

testVar = 0

def testFunc():
    global testVar
    testVar += 1

print testVar
testFunc()
print testVar

дае выхад

>>> 
0
1

Майце на ўвазе, што вам трэба толькі аб'явіць іх глабальны ўнутры функцыі, калі вы хочаце зрабіць заданні/змяніць іх. <�Код> глабальны не патрабуецца для друку і доступу.

Вы можаце зрабіць,

def testFunc2():
    print testVar

без абвяшчэння глабальны , як мы гэта рабілі ў першай функцыі, і гэта будзе па-ранейшаму даюць значэнне усё ў парадку.

Выкарыстанне спіс У якасці прыкладу, вы не можаце прызначыць спіс без абвяшчэння глабальны , але вы можаце назваць гэта метады і змяніць спіс. Як след.

testVar = []
def testFunc1():
    testVar = [2] # Will create a local testVar and assign it [2], but will not change the global variable.

def testFunc2():
    global testVar
    testVar = [2] # Will change the global variable.

def testFunc3():
    testVar.append(2) # Will change the global variable.
22
дададзена
Гэта было ўсяго толькі дадатковая частка, калі вы хочаце, каб абыйсці з дапамогай спіс у якасці глабальнай зменнай, гэта адна з рэчаў, якія вы можаце мець на ўвазе, вы маглі б назваць метады глабальнай зменнай у функцыя ніколі не абвяшчаючы яго глабальны , як testFunc3 робіць. Але, калі вы хочаце прызначыць нешта да глабальны зменнай, вам трэба аб'явіць яго глабальны у функцыі як testFunc2 робіць.
дададзена аўтар Sukrit Kalra, крыніца
@stgeorge - Так, гэта на самай справе змяняе спіс, і вы маеце рацыю ў тым, што вы кажаце, таму я стаўлю гэты прыклад у адказ, так што вы можаце ведаць пра гэта. Адносна таго, чаму гэта было дазволена, я не зусім упэўнены.
дададзена аўтар Sukrit Kalra, крыніца
Прывітанне Сакре. Дзякуй за адказ. Я зьбянтэжаны пра тое, што апошняй частцы ( «Выкарыстанне спісу ў якасці прыкладу, вы не можаце прысвоіць спіс, не абвяшчаючы яго глабальным, але вы можаце назваць гэта метады і змяніць спіс. Як вынікае.»), І гэта трэцяя частка. Не выкарыстоўваючы метад спіс азначае, што вы змяняеце зменную, якая з вобласці бачнасці, і далей больш вы не «прызначыць», каб быць глабальным ў галіне бачнасці функцыі? Як гэта можа быць?
дададзена аўтар stgeorge, крыніца
Дзякуй Сакре.
дададзена аўтар stgeorge, крыніца
Прывітання. Я родам з фону JS, так што гэта цікавая канцэпцыя для мяне. Тое, што я не разумею, чаму глабальнага Foo і выраз знаходзіцца на 2-х розных лініях? Як жа глабальны Foo = ўваход() ня сапраўдны? Гэта тое, што высадзіўся мяне па гэтым пытанні.
дададзена аўтар Memj, крыніца

Глабальны можа атрымаць доступ любой функцыі, але яно можа быць зменена толькі калі відавочна паказаць гэта з «глабальным» ключавым словам ўнутры функцыі. Возьмем, напрыклад, функцыю, якая рэалізуе лічыльнік. Вы можаце зрабіць гэта з глабальнымі зменнымі, як гэта:

count = 0

def funct():
    global count
    count += 1
    return count

print funct() # prints 1
a = funct() # a = 2
print funct() # prints 3
print a # prints 2

print count # prints 3

Цяпер, гэта ўсё выдатна і добра, але гэта, як правіла, не з'яўляецца добрай ідэяй выкарыстоўваць глабальныя зменныя для нічога, акрамя канстант. Вы маглі б мець альтэрнатыўную рэалізацыю з дапамогай засавак, якія б не забруджваць прастору імёнаў і быць значна чысцей:

def initCounter():
    count = 0
    def incrementCounter():
        count += 1
        return count

    #notice how you're returning the function with no parentheses 
    #so you return a function instead of a value
    return incrementCounter 

myFunct = initCounter()
print myFunct() # prints 1
a = myFunct() # a = 2
print myFunct() # prints 3
print a # prints 2

print count # raises an error! 
            # So you can use count for something else if needed!
2
дададзена

Разгледзім наступны код:

a = 1

def f():
    # uses global because it hasn't been rebound
    print 'f: ',a

def g():
    # variable is rebound so global a isn't touched
    a = 2
    print 'g: ',a

def h():
    # specify that the a we want is the global variable
    global a
    a = 3
    print 'h: ',a

print 'global: ',a
f()
print 'global: ',a
g()
print 'global: ',a
h()
print 'global: ',a

выхад:

global:  1
f:  1
global:  1
g:  2
global:  1
h:  3
global:  3

У асноўным вы карыстаецеся глабальны пераменны, калі вам патрэбныя ўсе функцыі для доступу да аднаго пераменнаму (аб'екту). Гэта не заўсёды лепшы спосаб, хоць.

2
дададзена

У прыведзеным ніжэй прыкладзе мы маем зменную з вызначаецца па-за любой іншай функцыі. У Foo мы аб'яўляем C , павялічыць яго і раздрукаваць яго. Вы можаце бачыць, што некалькі разоў выкліку Foo() дасць той жа вынік зноў і зноў, таму што з у Foo з'яўляецца лакальным па сваім аб'ёме функцыя.

У бар , аднак, ключавое слова глабальны дадаецца перад з . Цяпер пераменная з спасылкі любая пераменная з вызначаны ў глабальным маштабе (гэта значыць. Наш з = 1 асобнік вызначаны да функцый). Выклік бар некалькі разоў абнаўляе глабальны C замест адной вобласцю дзеянні на мясцовым узроўні.

>>> c = 1
>>> def foo():
...     c = 0
...     c += 1
...     print c
...
>>> def bar():
...     global c
...     c += 1
...     print c
...
>>> foo()
1
>>> foo()
1
>>> foo()
1
>>> bar()
2
>>> bar()
3
1
дададзена

Explicit declaration by using global inside a function should help

1
дададзена

Я паспрачаўся з тым жа пытаннем/няправільна зразумеў, што я хацеў на працягу некалькіх дзён, і я думаю, што вы, магчыма, спрабуеце дасягнуць, гэта ёсць функцыя выхад вынік, які можа быць выкарыстаны пасля таго, як функцыя завяршэння працы.

Тое, як вы можаце зрабіць вышэй, выкарыстоўваючы <�моцны> вяртанне «нейкі вынік», а затым прызначаючы, што да зменнай пасля функцыі. Вось прыклад ніжэй:

#function
def test_f(x):
    y = x + 2
    return y

#execute function, and assign result as another variable
var = test_f(3)
#can use the output of test_f()!
print var      #returns 5
print var + 3  #returns 8
0
дададзена

Нармальная пераменная выкарыстоўваецца толькі ўнутры функцыі, глабальная пераменная можа быць выклікана для па-за функцыі, але не выкарыстоўваць гэта, калі не трэба, гэта можа прывесці да памылак і буйныя кампаніі праграмавання лічаць гэта навабранец рэч рабіць.

0
дададзена