Python » Страница 757

-

Программирование на Python



dimy44


репутация: 537
на сайте с 2006 года
сообщений: 2540

HTC One S

Евпатория

Возраст - 53

#7561

нуу хотел еще глянуть, а ты вот уже после свой пост так отредактировал, что теперь еще хуже стало, да и смысл моего того ответа теряется...

nur87


репутация: 60
на сайте с 2006 года
сообщений: 559

Explay Golf

Казань

Возраст - 37

#7562

dimy44
что-то я ошибся при редактировании.
если не ошибаюсь то терь все как было.

dimy44


репутация: 537
на сайте с 2006 года
сообщений: 2540

HTC One S

Евпатория

Возраст - 53

#7563

ясно. Блин, лень щас рыть доки второго питона, там я гляжу bind по-другому, но надеюсь, ты знаешь, что делаешь. Ладно. Там у тебя вызывается gui_doma. В ней на объекте img1 чето рисуется. И че толку? В следующий момент вызывается функция gui_redraw, где, как у тебя прописано в условии, блитируется не img1, а img, ибо в функции gui_doma ты не заюзал инструкцию global по отношению к переменной state. Я это писал выше. Вобщем, допиши перед тем, как записать туда новое значение строку global state. Тем самым ты укажешь интерпретатору, что ты юзаешь именно ту state, поместив ее в глобальное пространство имен, всвязи с чем она будет видна в любой функции. В твоем же случае ты просто создал одноименную локальную переменную state в функции gui_doma и присвоил ей ссылку на значение 2, но она не имеет отношения к той state, что читается в qui_redraw.

nur87


репутация: 60
на сайте с 2006 года
сообщений: 559

Explay Golf

Казань

Возраст - 37

#7564

dimy44
спасибо огромное. проблема была действительна с global

дописал в функцию gui_doma() строчку global state, и все заработало так как надо. получается что и в других функциях эта переменная будет глобальной без объявлении global state

я думал что я понял как работают переменные в скрипте, т.е. если я присваиваю в главном скрипте state то она будет уже глобальной для всего скрипта. наподобии того же как и
canvas=appuifw.Canvas(). ведь canvas доступен у нас в любой функции

тогда у меня такой вопрос, если я напишу в скрипте (не в функции) global state, то скрипт все равно не работает. ведь я же объявил её уже глобальной

dimy44


репутация: 537
на сайте с 2006 года
сообщений: 2540

HTC One S

Евпатория

Возраст - 53

#7565

Вне функции переменную объявлять global незачем, хотя в некоторых примерах так делают, но это бестолково. Внутри каждой функции, в таких случаях, нужно объявлять только тогда, когда присваиваешь ей значение. Если же переменная внутри функции юзается только для чтения, то объявлять не нужно, и так ясно, она ведь уже была создана, а вот в случае присваивания значения- другое дело, ведь внутри функции без особой инструкции создается локальная переменная, видимая лишь внутри этой функции, пусть даже с таким-же именем, как и глобальная в другом месте, но в разных пространствах имен.
-------------
добавлено в 09.23: вообще эти global многие ненавидят. Вот ты можешь создать пустой класс
class C: pass
pss = C() # инстанс
теперь можешь с ним работать:
pss.state = 1, переменная pss.state не нуждается в инструкции global.

nur87


репутация: 60
на сайте с 2006 года
сообщений: 559

Explay Golf

Казань

Возраст - 37

#7566

спасибо за разъяснения.

dimy44


репутация: 537
на сайте с 2006 года
сообщений: 2540

HTC One S

Евпатория

Возраст - 53

#7567

и еще (на правах занудства): мне кажется не совсем удачным выбор значений переменной-флажка state, лучше 0 и 1, и тогда ты сможешь уже с ней работать как с указателем индекса, минуя условия-проверки-сравнения. Скажем, функцию gui_redraw можно в одну строку записать: def gui_redraw(x): canvas.blit((img, img1)[state])

nur87


репутация: 60
на сайте с 2006 года
сообщений: 559

Explay Golf

Казань

Возраст - 37

#7568

dimy44
ого. круто. я не додумался бы до такого. буду юзать индексы. спасибо большое
-------------
добавлено в 11.10: и ещё такой вопрос

class Home:
def pr(self):
self.i='10'
print '1'

home=Home()
home.pr()
print home.pr.i

получаю ошибку
AttributeError: 'function' object has no attribute 'i'

что я делаю не так.
в классах global как я понимаю вообще не используется?

dimy44


репутация: 537
на сайте с 2006 года
сообщений: 2540

HTC One S

Евпатория

Возраст - 53

#7569

не home.pr.i, а home.i

nur87


репутация: 60
на сайте с 2006 года
сообщений: 559

Explay Golf

Казань

Возраст - 37

#7570

спасибо.
так как, global в классах используется? если я правильно понимаю, то они и так глобальные, привязанные к классу


Яндекс.Метрика