/ / Специфичен проблем, свързан с рефериране на променливи - python, python-2.7, функция, променливи, справка

Специфично издание, свързано с променливите референции - python, python-2.7, функция, променливи, референция

Сега искам да стане ясно, че не искам да включвам променливата b като аргумент на функцията g, Има ли друг начин, по който бих могъл да се справяпренаписване на този код, като се има предвид, че g се нарича рекурсивно? Дори споменаването на b = 0 и извикването му като глобално, не изглежда да помогне с грешката при заданието.

global b
b = 0
def g(x):
if b < x:
for i in range(10):
if u == i:
b += 1
g(x)    #g is called recursively
for u in range(20):
b = 5
g(7)

Отговори:

1 за отговор № 1
# that is from MSeifert(voted is correct), @Chalid
b = 0
first = []
second = []
def g(x):
global b  # So python knows you use the global variable!
first.append(b)
if b < x:
for i in range(10):
if u == i:
b += 1
g(x)

for u in range(20):
b = 5
g(7)


# my solution is without any global variable
# and the result matching the expectation

def g(x,b):
second.append(b)
if b < x:
for i in range(10):
if u == i:
b += 1
g(x,b)    #g is called recursively
b = 5
for u in range(20):
g(7,b)

print len(first), len(second)
print first
print second

40 40
[5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5]
[5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5]

1 за отговор № 2

global се използва, когато изрично искате да използвате и актуализирате a global променлива. Така че трябва да използвате global b във вашата функция, а не отвън:

b = 0

def g(x):
global b  # So python knows you use the global variable!
if b < x:
for i in range(10):
if u == i:
b += 1
g(x)

for u in range(20):
b = 5
g(7)

Защото ползвате b += 1 вътре в твоя g функция, която трябва да декларирате b като global, В противен случай получавате UnboundLocalError:

UnboundLocalError: локална променлива "b", посочена преди присвояване

Вижте също Python често задавани въпроси:

Какви са правилата за локални и глобални променливи в Python?

В Python променливите, които се отнасят само до тяхв дадена функция са имплицитно глобални. Ако на дадена променлива се присвоява стойност навсякъде в тялото на функцията, се приема, че тя е локална, освен ако не е изрично обявена за глобална.

Макар да е малко изненадващо отначало, обяснението за момента обяснява това. От една страна, изисквайки global за зададените променливи осигурява лента срещу нежелани странични ефекти. От друга страна, ако global се изискваше за всички global ще използвате global през цялото време. Трябва да декларирате като global всяка препратка към вградена функция или към компонент на внесения модул. Този хаос ще попречи на полезността на global декларация за идентифициране на страничните ефекти.


0 за отговор № 3

Това може да направи косата на хората в крайна сметка, но можете да добавите b като атрибут на g.

def g(x):
If g.b > x:
...

g.b = 5
....