2017-01-28 36 views
0

Я питон и общее программирование noob. Программируется только около 2 недель. У меня есть быстрый вопрос относительно функций в python. Может кто-нибудь объяснить, почему это работает:Функция в функции функции

import random 
valuea = valueb = valuec = "0" 
stationary = "X" 
def func1(): 
    print("",valuea,"\n",valueb,"\n",valuec) 
    return 
random.seed(0) 
random_list = ("valuea","valueb","valuec") 
random_result = random.choice(random_list) 
locals()[random_result] = stationary 
func1() 

Результат:

0 
X 
0 

Но это, однако, не работает:

def func1(): 
    import random 
    valuea = valueb = valuec = "0" 
    stationary = "X" 
    def func2(): 
     print("",valuea,"\n",valueb,"\n",valuec) 
     return 
    random.seed(0) 
    random_list = ("valuea","valueb","valuec") 
    random_result = random.choice(random_list) 
    locals()[random_result] = stationary 
    func2() 
    return 
func1() 

Результат:

0 
0 
0 

Есть ли способ ke работает во второй ситуации, находясь внутри функции?

ответ

0

Давайте посмотрим на более простеньком примере:

def func1(): 
    a = 0 
    def func2(): 
     print(a) 
    locals()['a'] = 1 
    print(a) 
    func2() 

func1() 
print(a) 

Это выводит

0 
0 
1 

т.е. переменная a локальной для обеих функций не изменяется. Рассматривая документацию locals, можно обнаружить, что «... изменения могут не влиять на значения локальных и свободных переменных, используемых интерпретатором». Таким образом, используя его для изменения значения локальных переменных могут или не могут работать ...

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

def func1(): 
    d = {'a' : 0} 
    def func2(): 
     print(d['a']) 
    d['a'] = 1 
    print(d['a']) 
    func2() 

func1() 
print(d['a']) 

что приводит к следующему выходу:

1 
1 
Traceback (most recent call last): 
    File "...", line 10, in <module> 
    print(d['a']) 
NameError: name 'd' is not defined 

исключения вызвано последней строкой правильное поведение, так как d определяется только в пределах func1. Поэтому он недоступен за пределами func1.

Вы можете узнать больше о областях, например. here.

+0

Большое спасибо! Опять :) – IrvinLesh

+0

Np - Вероятно, я виноват в том, что я показал вам этот материал с местными жителями. Было бы лучше показать вам список вариантов с самого начала. –