#python #function #parameters #global #local
#python #функция #параметры #глобальный #Местные новости
Вопрос:
Вот проблема, которую я пытаюсь решить:
У меня есть первая функция, к которой я добавляю аргументы. Затем, позже, у меня есть вторая функция, из которой я хочу вызвать в качестве переменной указанный аргумент родительской функции. Итак, это выглядит так:
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
Мне нужно импортировать обе функции в другой файл, и я не могу «демонтировать» дочернюю функцию внутри родительской функции.
Большое спасибо за любую помощь!
Комментарии:
1. разве вы не можете передать значение в дочерней функции?
Ответ №1:
Не используйте глобальные переменные. Каждой функции нужны собственные аргументы:
def parent_function(x):
if statement:
x = child_function(x)
else:
...
return result
def child_function(x):
x = x 5
return x
Ответ №2:
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
Ответ №3:
Эта ошибка возникает из-за того, что вы пытаетесь перезаписать параметр в функции, область действия которой локальна для этой функции, присвоив ей глобальную область действия. Проблема в том, что переменные, определенные в контексте функции, по определению являются локальными переменными. Чтобы лучше проиллюстрировать эту проблему, вы можете просто попытаться запустить этот фрагмент кода:
def parent_function(argument="Hello"):
global argument
return argument
Вы увидите, что он не будет запущен по той же причине, которую я объяснил. Надеюсь, я был ясен в своем объяснении. Удачи.
Ответ №4:
Первое, что вам нужно изменить, это:
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
аргументы from in parent_function
и x
used in 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, если это поможет, но вы наверняка чему-то научитесь из этого!