Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 12, 2012 07:48:47

Bars
Зарегистрирован: 2012-08-11
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Глюк с обнулением

Здравствуйте.
Прилагаю программу и тест-файлы(запуск python gp.py gpm.SMF gpm.TXT). Компилятор python 2.7 В чем баг: переменная n в течении выполнения первой процедуры равна 76. При вызове следующей- компилятор её обнуляет. Сравнивал с вектором f- там такого нет. Помогите пожалуйста решить эту проблему(мне нужно, чтобы сохранялись все глобальные переменные)

Прикреплённый файлы:
attachment Py.zip (5,1 KБ)

Офлайн

#2 Авг. 12, 2012 08:27:09

ziro
От:
Зарегистрирован: 2009-08-13
Сообщения: 225
Репутация: +  8  -
Профиль   Отправить e-mail  

Глюк с обнулением

Компилятор ее не обнуляет. Просто у Вас в первой функции стоит присваивание

	n=i
	m=len(b)

В этом случае компилятор создает локальные переменные с такими же именами, которые перекрывают область видимости глобальных переменных. Это всегда делается в целях безопасности, чтобы случайно не разрушить глобальные данные.

Если бы у Вас первым обращением к n было чтение данных, типа i=n, то компилятор нашел бы Вашу переменную среди глобальных и далее использовал ее. Это и происходит в Вашей второй функции.

Для решения Вашей проблемы лучше всего задекларировать в начале первой функции нужные Вам переменные как глобальные, типа

        global n, m

чтобы компилятор понимал откуда эти переменные брать.



Офлайн

#3 Авг. 12, 2012 11:01:49

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Глюк с обнулением

Если бы у Вас первым обращением к n было чтение данных, типа i=n, то компилятор нашел бы Вашу переменную среди глобальных и далее использовал ее. Это и происходит в Вашей второй функции.
Не совсем так:
>>> n = 1
>>> def foo():
... i = n
... n = 2
...
>>> foo()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in foo
UnboundLocalError: local variable 'n' referenced before assignment

Офлайн

#4 Авг. 12, 2012 11:49:18

ziro
От:
Зарегистрирован: 2009-08-13
Сообщения: 225
Репутация: +  8  -
Профиль   Отправить e-mail  

Глюк с обнулением

Не совсем так:

Почему?

>>> n = 1
>>> def foo():
...     i = n
...     print i
...
>>> foo()
1
>>>

А у Вас опять же перекрытие области видимости из-за n = 2



Офлайн

#5 Авг. 12, 2012 11:54:24

Bars
Зарегистрирован: 2012-08-11
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Глюк с обнулением

global не спасло

Офлайн

#6 Авг. 12, 2012 12:19:47

ziro
От:
Зарегистрирован: 2009-08-13
Сообщения: 225
Репутация: +  8  -
Профиль   Отправить e-mail  

Глюк с обнулением

Должно работать:

Windows PowerShell
(C) Корпорация Майкрософт, 2009. Все права защищены.
PS C:\Users\Vlad> python
Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> n = 1
>>> print n
1
>>> def foo():
...     global n
...     n = 10
...
>>> foo()
>>> print n
10
>>>



Отредактировано ziro (Авг. 12, 2012 12:21:47)

Офлайн

#7 Авг. 12, 2012 12:47:43

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Глюк с обнулением

ziro
Почему?
Просто звучит запутывающее, якобы “i=n” достаточно что-б использовать перемененную (в т.ч. и для записи):
Просто у Вас в первой функции стоит присваивание …
Если бы у Вас первым обращением к n было чтение данных, типа i=n, то компилятор нашел бы Вашу переменную среди глобальных и далее использовал ее.

Знаете как изменить значение переменной в родительской ф-ии штатным способом (без помощи дополнительных переменных (глобальных) и пр.) ?
def foo():
i = 1
def bar():
print i
i = 2
bar()
foo()

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version