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

	n=i
	m=len(b)

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

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

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

        global n, m

чтобы компилятор понимал откуда эти переменные брать.
o7412369815963
Если бы у Вас первым обращением к 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
ziro
Не совсем так:

Почему?

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

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

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

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