LINUX.ORG.RU

python область видимости переменной

 


1

2

python2.7

list = []
def fn1(x=1):
   def fn2():
      print x
   y=fn2
   list.insert(0,y)
fn1()
ref_to_fn2 = list[0]
ref_to_fn2()
напечатает 1, но если попытаться использовать x в функции
def fn2():
   print x
   x=2
то будет ошибка local variable 'x' referenced before assignment, мне это не мешает но почему и зачем это происходит?

print x

Поясни мне эту конструкцию. Не уверен как там во втором питоне, но в третьем надо

print(x)

peregrine ★★★★★ ()
Ответ на: комментарий от peregrine

What’s New In Python 3.0

The print statement has been replaced with a print() function, with keyword arguments to replace most of the special syntax of the old print statement

creazero ()
Ответ на: комментарий от peregrine

во втором питоне можно было и так вызывать print.

cetjs2 ★★★★★ ()

Просто у питона довольно странные правила скопинга. Из-за этого переменная не может быть сразу глобальной и локальной.

creazero ()
Ответ на: комментарий от peregrine

как уже успели написать- во втором это statement т.е аналог return import break итд

questor ()
Ответ на: комментарий от creazero

Просто у питона довольно странные правила скопинга.

Например?

Siado ★★★★★ ()

но почему и зачем это происходит?

видимо при наличии присваивания «x» распознаются как локальная, если версия питона поддерживает «nonlocal» - должно помочь

anonymous ()

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

Полтреда питонистов не читало мануал по питону, о дивный стабильный лор.

anonymous ()
Ответ на: комментарий от provaton

Форум и нужен для того, чтобы делиться знаниями. Если хочешь просто срача с хомячками иди в vk, благо там их полно, они не пуганые, а знаний у них мало в среднем.

peregrine ★★★★★ ()

Ну тут все просто, если где-то в функции есть присвоение «x», то «х» считается локальной переменной для всей функции. Почему? Мб оптимизационные задачи. Мб что б небыло говна как js, когда ты опечатался а компилятор все равно выполнит код, результат будет почти наверняка не правильным, но ведь не падает, смотри как надежно!1!111!. Мб потому что одновременное использование переменной с одним именем в функции как локальную и как глобальную неподерживаемый говнокод и выстрел себе в ногу из дробовика в недалеком будущем.
Если же твой вопрос, «как присваивать глобальной переменной значение в функции?», то гугли global и nonlocal.

Aswed ★★★★★ ()
Последнее исправление: Aswed (всего исправлений: 1)
Ответ на: комментарий от Aswed

Помню как вроде Лавесанчик как то сравнивал python с common lisp и довольно аргументировано показал, что первый есть УГ. Так что удивительно, что этот язычок снискал такую популярность. Ведь тот же tcl на порядок лучше, а по скорости не уступает.

anonymous ()
Ответ на: комментарий от anonymous

снискал популярность ровно по двум причинам - простой, и синтаксис мешает делать говнокод (в отличие от похапэ/сишечки/прочего). ну и кучка фреймворков в довесок.

хотя да, есть укурки которым и на тикле и прочих lua писать штырит...

NiTr0 ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.