2016-09-28 6 views
1

У меня есть небольшой вопрос о переменных. Мой основной язык Java (и я учусь Python), так что, у меня есть проблема, вызывающая переменную в функции, она не обновляет свое новое значение:Переменные Python в функциях?

# Values 
global e1x, e1y, e1c, e2x, e2y, e2c, altx, alty, x, y 

def getValues(): 
    print("Taking Ax + By = C:") 
    e1x = float(input("Value of x in first equation: ")) 
    #... 
    if(confirm()): # A function I ommited 'cause its irrelevant 
     return e1x, e1y, e1c, e2x, e2y, e2c 
    else: 
     getValues() 

def calculateValues(): 
    # Stuff with variables 


# MAIN 
getValues() 
calculateValues() 

Я пытался писать без глобальный, попытался использовать self слово, но оно не работает. (Использование Python 3)

ОШИБКА:

Traceback (most recent call last): 
    File "E002_GaussSeidel.py", line 41, in <module> 
     calculateValues() 
    File "E002_GaussSeidel.py", line 34, in calculateValues 
     print(str(e1x)) 
NameError: name 'e1x' is not defined 
+1

Burn * global e1x, e1y, e1c, e2x, e2y, e2c, altx, alty, x, y *. Вы действительно не хотите использовать глобальные переменные. Вы также должны использовать 'self' в методе класса, где self относится к экземпляру, на который будет вызван метод. Если вы хотите использовать эту логику, тогда фактически создайте класс, а не только функции. –

+0

«Это не работает» не является описанием проблемы. Вы получили сообщение об ошибке? Если да, то какова полная трассировка? Это ведет себя неожиданно? Если это так, опишите ожидаемое и фактическое поведение. –

+0

Python говорит, что «e1x не определен», когда я пытаюсь использовать его на «calculateValues ​​()», но я объявил сверху и инициализировал функцию, которая фактически возвращает эти значения. @SvenMarnach –

ответ

2

Вы должны включить global в пределах вашей функции. Снаружи он ничего не делает.

def getValues(): 
    global e1x, e1y, e1c, e2x, e2y, e2c, altx, alty, x, y 
    print("Taking Ax + By = C:") 
    e1x = float(input("Value of x in first equation: ")) 
    #... 
    if(confirm()): # A function I ommited 'cause its irrelevant 
     return e1x, e1y, e1c, e2x, e2y, e2c 
    else: 
     getValues() 

def calculateValues(): 
    # Stuff with variables 


# MAIN 
getValues() 
calculateValues() 

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

переформатировать код быть как:

def getValues(): 
    print("Taking Ax + By = C:") 
    e1x = float(input("Value of x in first equation: ")) 
    #... 
    if(confirm()): # A function I ommited 'cause its irrelevant 
     return e1x, e1y, e1c, e2x, e2y, e2c 
    else: 
     getValues() 

def calculateValues(values): 
    # Stuff with variables 


# MAIN 
calculateValues(getValues()) 

Вместо передачи информации с глобальными переменными, это передает информацию по возвращаемым значениям. There are hundreds of articles on why global variables are evil.

values содержит возвращаемые переменные e1x, e1y, e1c, e2x, e2y, e2c. Он доступен с использованием нотации индекса списка. Если вы хотите, чтобы обратиться к переменным по их именам, используйте:

#... 
def calculateValues(e1x, e1y, e1c, e2x, e2y, e2c): 
    # Stuff with variables 


# MAIN 
calculateValues(*getValues()) 

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

+0

Да, я буду использовать in calculateValues ​​() –

+0

@ AlfonsoIzaguirreMartínez Нет, вы этого не сделаете. 'calculateValues ​​()' должен вызывать 'getValues ​​()' и использовать возвращаемое значение. Или вы можете передать результат 'getValues ​​()' в 'calculateValues ​​()'. Глобальные переменные являются злыми. –

Смежные вопросы