Аргумент функции Python не может использоваться в качестве переменной в дочерней функции

#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, если это поможет, но вы наверняка чему-то научитесь из этого!