Вызывающая переменная, определенная внутри одной функции от другой функции

если у меня есть это:

def oneFunction(lists):
    category=random.choice(list(lists.keys()))
    word=random.choice(lists[category])

def anotherFunction():
    for letter in word:              #problem is here
        print("_",end=" ")

Я ранее определял lists, поэтому oneFunction(lists) работает отлично.

Моя проблема вызывает word в строке 6. Я попытался определить word вне первой функции с тем же определением word=random.choice(lists[category]), но это делает word всегда одинаковым, даже если я вызываю oneFunction(lists).

Я хочу иметь возможность, каждый раз, когда я вызываю первую функцию, а затем вторую, имею другую word.

Могу ли я сделать это, не указав, что word вне oneFunction(lists)?

Ответ 1

Да, вы должны подумать о том, чтобы определить как вашу функцию в классе, так и сделать слово членом. Это чище

class Spam:
    def oneFunction(self,lists):
        category=random.choice(list(lists.keys()))
        self.word=random.choice(lists[category])

    def anotherFunction(self):
        for letter in self.word:              
        print("_",end=" ")

Как только вы создадите класс, вы должны создать его для объекта и получить доступ к функциям-членам.

s = Spam()
s.oneFunction(lists)
s.anotherFunction()

Другим подходом было бы сделать oneFunction вернуть слово, чтобы вы могли использовать oneFunction вместо слова в anotherFunction

>>> def oneFunction(lists):
        category=random.choice(list(lists.keys()))
        return random.choice(lists[category])


>>> def anotherFunction():
        for letter in oneFunction(lists):              
        print("_",end=" ")

И, наконец, вы также можете сделать anotherFunction, принять слово как параметр, который вы можете передать из результата вызова oneFunction

>>> def anotherFunction(words):
        for letter in words:              
        print("_",end=" ")
>>> anotherFunction(oneFunction(lists))

Ответ 2

Все в python рассматривается как объект, поэтому функции также являются объектами. Таким образом, вы также можете использовать этот метод.

def fun1():
    fun1.var = 100
    print(fun1.var)

def fun2():
    print(fun1.var)

fun1()
fun2()

print(fun1.var)

Ответ 3

def anotherFunction(word):
    for letter in word:              
        print("_", end=" ")

def oneFunction(lists):
    category = random.choice(list(lists.keys()))
    word = random.choice(lists[category])
    return anotherFunction(word)

Ответ 4

Самый простой вариант - использовать глобальную переменную. Затем создайте функцию, которая получает текущее слово.

current_word = ''
def oneFunction(lists):
    global current_word
    word=random.choice(lists[category])
    current_word = word

def anotherFunction():
    for letter in get_word():              
          print("_",end=" ")

 def get_word():
      return current_word

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