Аргумент функции 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

Мне нужно импортировать обе функции в другой файл, и я не могу «разобрать» дочернюю функцию внутри родительской функции.

Большое спасибо за любую помощь!

вы не можете передать значение в дочернюю функцию?

sahasrara62 13.12.2020 05:19
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
897
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

Другие вопросы по теме