среда, 4 июня 2014 г.

Понимаем UnboundLocalError

Опять же на programmingwats.tumblr.com наткнулся на небольшую особенность питона.

my_str_1 = "1: outside of func"
my_str_2 = "2: outside of func"
def func_1():
    my_str_1 = "1: inside the func"
    my_str_2 = "2: inside the func"
    def func_2():
        print(my_str_1)
        print(my_str_2)
        my_str_1 = "1: inside the class"
    func_2()

func_1()
prints:
Traceback (most recent call last):
  File “<stdin>”, line 1, in <module>
  File “<stdin>”, line 8, in func_1
  File “<stdin>”, line 5, in func_2
UnboundLocalError: local variable ‘my_str_1’ referenced before assignment

В принципе на эту тему написано довольно много постов и погуглив можно спокойно найти объяснение. Но т.к. в свое время эта особенность питона попила у меня много кровушки я решил написать небольшой пост.

В чем причина такого поведения?
Причина заключается в том что питон преобразует переменную my_str_1 в локальную для func_2 и во время вызова функции print получает на вход не инициализированную переменную.
Решения проблемы тривиальные - либо убрать print, либо изменить название переменной, или объявить my_str_1 как глобальную.

Кто хочет более подробно ознакомиться с причинами такого поведения см ссылки, особенно с [2]

Ссылки

[1]https://docs.python.org/2/faq/programming.html#why-am-i-getting-an-unboundlocalerror-when-the-variable-has-a-value
[2]http://eli.thegreenplace.net/2011/05/15/understanding-unboundlocalerror-in-python/
[3]http://programmingwats.tumblr.com/page/2

Комментариев нет:

Отправить комментарий