Вот проблема, которую я пытаюсь решить:
У меня есть первая функция, в которую я ввожу аргументы. Затем, позже, у меня есть вторая функция, из которой я хочу вызвать в качестве переменной указанный аргумент родительской функции. Итак, это выглядит так:
def parent_function(argument=x):
if statement:
child_function()
else:
...
return result
def child_function():
x = x + 5
return x
Если я запускаю такой код, я получаю сообщение об ошибке в дочерней функции, говорящее name 'x' is not defined
.
Однако, если я исправлю свой код, чтобы сделать x глобальным в родительской функции, например:
def parent_function(argument=x):
global x
if statement:
child_function()
else:
...
return result
def child_function():
x = x + 5
return x
Я получаю ошибку name 'x' is parameter and global
Мне нужно импортировать обе функции в другой файл, и я не могу «разобрать» дочернюю функцию внутри родительской функции.
Большое спасибо за любую помощь!
name 'x' is parameter and global
означает, что вы не можете перезаписать параметр x
как глобальный. Чтобы исправить это, используйте другую переменную y
, например:
def parent_function(argument=x):
global y
y = x
if statement:
child_function()
else:
...
return result
def child_function():
y = y + 5
return y
Эта ошибка возникает из-за того, что вы пытаетесь перезаписать параметр в функции, область действия которой является локальной для этой функции, задав ей глобальную область. Проблема в том, что переменные, определенные в контексте функции, по определению являются локальными переменными. Чтобы лучше проиллюстрировать эту проблему, вы можете просто попробовать запустить этот фрагмент кода:
def parent_function(argument = "Hello"):
global argument
return argument
Вы увидите, что он не запустится по той же причине, которую я объяснил. Я надеюсь, что я был ясен в моем объяснении. Удачи.
Первое, что вам нужно изменить, это:
def parent_function(argument=x):
Если вы ищете, как сделать аргумент по умолчанию в функции, вы получите что-то вроде этого: https://www.geeksforgeeks.org/default-arguments-in-python/
. Это означает, что вместо x
вам нужно указать какое-то значение по умолчанию, например:
def parent_function(argument=5):
Это означает, что если вы не передадите аргумент с именем argument
функции, будет передано значение 5.
С другой стороны, кажется, что вы хотите, чтобы x
был аргументом, а это значит, что строка определения должна выглядеть так:
def parent_function(x=5):
Во-вторых, ключевое слово global
необходимо использовать в child_function
, поскольку x
не использовалось в parent_function
. Это приводит к этому:
def parent_function(x=5):
if statement:
child_function()
else:
...
return result
def child_function():
global x
x = x + 5
return x
Чтобы все это работало, должно быть как минимум еще две строки, одна для установки x
, а другая для вызова parent_function
, например:
x = 6
parent_function(4)
Но, чтобы быть еще смешнее, x
из аргументов в parent_function
и x
, используемых в child_function
, это не одно и то же, и вы сами можете убедиться в этом примере, который похож на ваш код, но полностью исполняемый:
def parent_function(x=5):
if True:
print(child_function())
else:
print("else branch")
return True
def child_function():
global x
x = x + 5
return x
x = 6
parent_function(4)
Это напечатает 11, даже если вы думаете, что напечатает 9!
Это связано с тем, что ключевое слово global
относится к (как говорится) глобальной переменной, объявленной вне функций, переменной со значением 6. Обычно локальные и глобальные переменные должны иметь разные имена, поэтому либо аргумент x
в parent_function
, либо глобальную переменную x
необходимо переименовать.
IDK, если это поможет, но вы точно чему-то научитесь!
Не используйте глобальные переменные. Каждой функции нужны свои аргументы:
def parent_function(x):
if statement:
x = child_function(x)
else:
...
return result
def child_function(x):
x = x + 5
return x
вы не можете передать значение в дочернюю функцию?