Найти - Пользователи
Полная версия: хм, кто нить объясните внятно
Начало » Python для экспертов » хм, кто нить объясните внятно
1 2
PanovSergey
my_str_1 = "1: outside of func"
my_str_2 = "2: outside of func"
def func():
    my_str_1 = "1: inside the func"
    my_str_2 = "2: inside the func"
    class C:
        print(my_str_1)
        print(my_str_2)
        my_str_1 = "1: inside the class"
func()
>>> outside of func
>>> inside the func

однако!?
мопед не мой
https://plus.google.com/u/0/+%D0%98%D0%B3%D0%BE%D1%80%D1%8C%D0%A3%D1%82%D0%BA%D0%B8%D0%BD/posts/2oXnn23DNp6
Singularity
a = 1
def func1():
    print  a
def func2():
    print  a
    a = 2
func1()
func2()
      4 def func2():
----> 5     print  a
      6     a = 2
      7 
UnboundLocalError: local variable 'a' referenced before assignment

а это?
Singularity
вот тут ZZZ написал что тут все ясно, но так и не объяснил
Budulianin
Singularity

С твоим кодом проще. Сначала происходит парсинг кода, потом исполнение. При парсинге в функции нашлось “a = 2”, значит в функции будет локальная переменная, при исполнении её кода. Когда код начал исполняться, то интерпретатор знал, что в функции будет локальная переменная, но на этой строчке “print a” она ещё не была определена.

Думаю, что здесь такая логика.
Singularity
Budulianin
я все равно нифига не понял.

Похоже этот кусок кода что парсит функцию (про который ты написал) работает и с классами, но берет переменные не в области на уровень выше, а просто в глобальном.

Думаю в питоне нельзя писать декларацию в классах или функциях.
Budulianin
Singularity

Я написал про твой код, к нему такая логика подходит. Про пример с классом, пока не знаю.
Singularity
Budulianin
когда узнаешь?
Budulianin
Singularity
когда узнаешь?

Когда захочу в этом разобраться, пока что другим занят. Или когда прочитаю тут, не знаю что раньше будет.

Я думаю, можно посмотреть функцию через dis.dis и может быть будет понятнее, что происходит на самом деле.
Singularity
Budulianin
dis.dis
через что?
Budulianin
Singularity
через что?

Через дизассемблирование

>>> import dis
>>> dis.dis(func2)
  2           0 LOAD_FAST                0 (a)
              3 PRINT_ITEM          
              4 PRINT_NEWLINE       
  3           5 LOAD_CONST               1 (2)
              8 STORE_FAST               0 (a)
             11 LOAD_CONST               0 (None)
             14 RETURN_VALUE

This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB