Присвоение значения переменной, определенной в функции, переменной в отдельной функции - PullRequest
0 голосов
/ 30 сентября 2018
def initColors():
   BLACK = (0,0,0)  
   RED = (255,0,0)
   BLUE = (0,0,255)
   LIGHTGRAY = (128,128,128)
   DARKGRAY = (64,64,64)
   WHITE = (255,255,255)
initColors()
def initOtherVars():
   nhover = WHITE
   hover = RED
   mselected = BLACK
   selected = RED
initOtherVars()

Я хочу установить для nhover значение БЕЛЫЙ , но я получаю эту ошибку:

Traceback (most recent call last):
   File "C:\Users\jarr3\Desktop\Python\Battlr\battlrSelectionScreen1.py", line 30, in <module>
initOtherVars()
   File "C:\Users\jarr3\Desktop\Python\Battlr\battlrSelectionScreen1.py", line 27, in initOtherVars
      nhover = WHITE
NameError: name 'WHITE' is not defined

Кажетсячто переменная не может быть присвоена значению переменной, определенной в функции в функции, даже если первая функция вызывается до того, как вторая будет определена.Почему это?И есть ли другой способ выполнить то, что я пытаюсь сделать.(Помимо того, что я просто не использую функции, я бы хотел продолжать использовать функции.) Спасибо.

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

Область действия initcolors() отличается от области действия initOtherVars().Вы можете создать одну функцию, которая включает все ваши переменные.

Или, если вы хотите иметь два отдельных объекта, вы можете рассмотреть объектно-ориентированное программирование и передать экземпляр одного класса другому.Например:

class initColors():
    def __init__(self):
        self.BLACK = (0, 0, 0)
        self.RED = (255, 0, 0)
        self.WHITE = (255, 255, 255)

MyColors = initColors()

class initOtherVars(initColors):
    def __init__(self, color_class):
        self.nhover = color_class.WHITE
        self.hover = color_class.RED
        self.mselected = color_class.BLACK
        self.selected = color_class.RED

MyOtherVars = initOtherVars(MyColors)

print(MyOtherVars.nhover)  # (255, 255, 255)
0 голосов
/ 30 сентября 2018

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

Подробнее об этом см. Краткое описание правил определения объема? .

Вы можете сделать свой глобальный:

def initColors():
    # declare them global
    global BLACK,RED,BLUE,LIGHTGRAY,DARKGRAY,WHITE
    BLACK = (0,0,0)  
    RED = (255,0,0)
    BLUE = (0,0,255)
    LIGHTGRAY = (128,128,128)
    DARKGRAY = (64,64,64)
    WHITE = (255,255,255)

initColors()

def initOtherVars():
    # need to be global as well, else invalid outside this scope 
    global nhover,hover,mselected,selected
    nhover = WHITE
    hover = RED
    mselected = BLACK
    selected = RED

initOtherVars()

Таким образом, сначала вы должны поместить цвета в глобальное пространство, а затем и другие переменные.


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

class MyColors:
   BLACK = (0,0,0)  
   RED = (255,0,0)
   BLUE = (0,0,255)
   LIGHTGRAY = (128,128,128)
   DARKGRAY = (64,64,64)
   WHITE = (255,255,255)

def initOtherVarsByClass():
    # these need still to be made global
    global Cnhover,Chover,Cmselected,Cselected
    Cnhover = MyColors.WHITE
    Chover = MyColors.RED
    Cmselected = MyColors.BLACK
    Cselected = MyColors.RED

initOtherVarsByClass()

Но вам все равно нужно сделать другие переменные global, чтобы иметь доступ кте, которые вы определили в вашей функции.Я думаю, что было бы легче сделать класс «держателем» и создать в нем свой mselected и т. Д. Для доступа к нему через класс.

class LinkColors():
    nhover = MyColors.WHITE
    hover = MyColors.RED
    mselected = MyColors.BLACK
    selected = MyColors.RED

Вы также можете создавать функции, которые просто возвращают вашцвет:

def GetSelected(): 
    return MyColors.RED

Вместо того, чтобы загромождать глобальное пространство, вы получаете больше классов.

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