Глобальная переменная в Python - PullRequest
3 голосов
/ 16 января 2012

Я очень новичок в Python. Уроки еще не выучены. Использование Python 3.2.2. Пытался реализовать некоторую процедурную логику Си. Мой код распространяется на 2 файла следующим образом.

этот файл называется date.py

dd,mm,yy=0,0,0

def isValidDate(d,m,y):
    if(d>=1 and d<=31 and m>=1 and m<=12):
        dd,mm,yy=d,m,y #problem
        print(dd,mm,yy) #problem
        print(d,m,y) #problem
        return True
    else:
        return False

def printDate():
    print(dd,mm,yy) #problem

этот файл называется module1.py

import date

def main():
    dd,mm,yy = 23,1,1984
    valid = date.isValidDate(dd,mm,yy) #problem
    print (valid)
    date.printDate()
    date.dd=22 #problem
    date.printDate()

if __name__ == '__main__':
    main()

Строки, которые я прокомментировал как «проблему», вызывают у меня проблемы.

Когда выполняется оператор в module1.py (то есть "date.dd=22"), значение глобальной переменной в date.py изменяется на 22 и остается таким же.

Но когда я вызываю функцию isValidDate(), даже если условие теста пройдено, назначение не кажется постоянным. Оператор локальной печати в функции isValidDate() показывает, что "dd" назначено значение, но в функции main() вызов printDate() показывает исходные значения.

Что происходит?

Ответы [ 2 ]

5 голосов
/ 16 января 2012

Ваша функция date.isValidDate не работает с global переменными dd, mm, yy - она ​​скорее работает с (функцией) локальных переменных с такими же именами.

Для того чтобы date.isValidDate изменила (модульные) глобальные значения переменных, которые вы хотите, вы должны объявить их как глобальные в верхней части функции - например:

def isValidDate(d,m,y):
    global dd, mm, yy
    ...
5 голосов
/ 16 января 2012

Чтобы присвоить значения глобальной переменной в вашем коде, вы должны пометить ее как таковую, иначе код будет присваивать локальной переменной с тем же именем (что на самом деле будет скрывать глобальную переменную).

Как объяснено в документации :

Было бы невозможно присвоить глобальную переменную без глобальной, хотя свободные переменные могут ссылаться на глобальные переменные, не будучи объявленными глобальными.

Следовательно, чтобы решить проблему, вам нужно что-то вроде этого:

def isValidDate(d,m,y):
    if(d>=1 and d<=31 and m>=1 and m<=12):
        global dd, mm, yy
        dd,mm,yy=d,m,y
        ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...