Вызывающая переменная, определенная внутри одной функции от другой функции
если у меня есть это:
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
Преимущество этого заключается в том, что, возможно, ваши функции находятся в разных модулях и нуждаются в доступе к переменной.