Mi variable está definida, pero Python dice que no lo es.

Sigo recibiendo un error que me dice que el nombre hourly_pay no está definido, pero lo tengo definido dentro de la función main .

Soy un principiante, ya que acabo de empezar la clase, pero para mí, parece que debería estar funcionando:

 commission_pay_amount = .05 income_taxes = .25 Pay_per_hour = 7.50 def main(): display_message() hourly_pay = float(input('Please enter amount of hours worked: ')) commission_pay = hourly_pay * commission_pay_amount gross_pay = hourly_pay + commission_pay witholding_amount = gross_pay * income_taxes hourly_paying = Pay_per_hour * hourly_pay net_pay = gross_pay - witholding_amount display_results() def display_message(): print('This program is used to calculate') print('the hourly pay, commission amount,') print('the gross pay, the withholding amount,') print('and the net pay amount') print() def display_results(): print('The hourly pay is $', format(hourly_pay, ',.2f')) print('The commission amount is $', format(commission_pay, ',.2f')) print('The gross pay is $', format(gross_pay, ',.2f')) print('The witholding amount is $', format(witholding_amount, ',.2f')) print('The net pay is $', format(net_pay, ',.2f')) main() 

En Python (a diferencia de JavaScript), las variables están localmente orientadas de forma predeterminada. Esto significa que solo se puede acceder a las variables dentro de la función en la que están definidas. Este comportamiento puede anularse, pero por lo general no desea eso .

Para ilustrar la diferencia, eche un vistazo a esta transcripción de python:

 >>> var1 = "this is global" >>> def foo(): ... var1 = "this is local" ... print(var1) ... >>> print(var1) this is global >>> foo() this is local >>> print(var1) this is global 

Como puede ver, aunque var1 está asignado a la función foo() , el valor del nombre var1 no cambia en el ámbito global. Si no hubiéramos definido var1 globalmente, las dos llamadas de print(var1) fuera de foo() fallarían con un error de nombre, al igual que su código.

La solución definitiva para su problema es manejar la salida en la función main() o pasar los valores a la función display_results() (esta última generalmente se prefiere, mantener la lógica y la salida separadas):

 def main(): display_message() hourly_pay = float(input('Please enter amount of hours worked: ')) commission_pay = hourly_pay * commission_pay_amount gross_pay = hourly_pay + commission_pay witholding_amount = gross_pay * income_taxes hourly_paying = Pay_per_hour * hourly_pay net_pay = gross_pay - witholding_amount display_results(hourly_pay, commission_pay, gross_pay, withholding_amount, net_pay) def display_message(): print('This program is used to calculate') print('the hourly pay, commission amount,') print('the gross pay, the withholding amount,') print('and the net pay amount') print() def display_results(hourly_pay, commission_pay, gross_pay, withholding_amount, net_pay): print('The hourly pay is $', format(hourly_paying, ',.2f')) print('The commission amount is $', format(commission_pay, ',.2f')) print('The gross pay is $', format(gross_pay, ',.2f')) print('The witholding amount is $', format(witholding_amount, ',.2f')) print('The net pay is $', format(net_pay, ',.2f')) 

El tutorial oficial de Python también tiene algunas palabras sobre los ámbitos de función (énfasis mío):

Más precisamente, todas las asignaciones de variables en una función almacenan el valor en la tabla de símbolos local; mientras que las referencias de variables primero miran en la tabla de símbolos local, luego en las tablas de símbolos locales de las funciones de encierro, luego en la tabla de símbolos global y, finalmente, en la tabla de nombres incorporados. Por lo tanto, a las variables globales no se les puede asignar directamente un valor dentro de una función (a menos que estén nombradas en una statement global ), aunque pueden ser referenciadas.

hourly_paying se define en main() y se mantiene en el scope de main. display_results pasarlo a display_results y modificar display_results para aceptar todos los valores que necesita. Por ejemplo:

 commission_pay_amount = .05 income_taxes = .25 Pay_per_hour = 7.50 def main(): display_message() hourly_pay = float(input('Please enter amount of hours worked: ')) commission_pay = hourly_pay * commission_pay_amount gross_pay = hourly_pay + commission_pay witholding_amount = gross_pay * income_taxes hourly_paying = Pay_per_hour * hourly_pay net_pay = gross_pay - witholding_amount display_results(hourly_paying,commission_pay,gross_pay,witholding_amount,net_pay) def display_message(): print('This program is used to calculate') print('the hourly pay, commission amount,') print('the gross pay, the withholding amount,') print('and the net pay amount') print() def display_results(hourly_paying,commission_pay,gross_pay,witholding_amount,net_pay): print('The hourly pay is $', format(hourly_paying, ',.2f')) print('The commission amount is $', format(commission_pay, ',.2f')) print('The gross pay is $', format(gross_pay, ',.2f')) print('The witholding amount is $', format(witholding_amount, ',.2f')) print('The net pay is $', format(net_pay, ',.2f')) main() input ('Press ENTER to continue....')