You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

定义的Python函数无返回值,执行无结果且变量未定义问题

问题排查与解决:Python函数无输出且变量未定义

问题描述

定义了一个生成DataFrame的Python函数,调用后无结果输出,尝试访问函数内创建的df_results变量时触发NameError,无其他运行报错。

原函数代码

def results(Water_depth,e,intv,Top_res,Base_res,Res_thickness,Depletion, Biot,Cm,C,nu): 
    df_results = pd.DataFrame((np.arange(Water_depth,e,intv)), columns=['Depth'])   # Creating data frame for results
    df_results['Z (m)'] = ((df_results['Depth']) - Water_depth)/Top_res    # Creating normalised depth
    conditions = [
        (df_results['Depth'] < Top_res),
        (df_results['Depth'] >= Top_res) & (df_results['Depth'] <= Base_res),
        (df_results['Depth'] > Base_res)
        ]
    df_results['definition'] = np.select(conditions, ['Overburden','Reservoir','Underburden'])   # defining data points as either overburden, reservoir and underburden
    # Calculation of Uz (broken into smaller componants)
    Z = df_results['Z (m)']
    a = (Cm/2)*Res_thickness*Depletion*Biot
    b = (C*(Z-1))/pow(1+C*C*(Z-1)*(Z-1),(1/2))
    c = ((3-(4*nu))*C*(Z+1))/pow(1+C*C*(Z+1)*(Z+1),(1/2))
    d = (2*C*Z)/pow((1+C*C*(Z+1)*(Z+1)),(3/2))
    e_OB = 3-(4*nu)+1   # +1 used if overburden
    e_UB = 3-(4*nu)-1   # -1 used if underburden
    conditions = [
        (df_results['definition'] == 'Overburden'),
        (df_results['definition'] == 'Reservoir'),
        (df_results['definition'] == 'Underburden')
        ]
    Uz_OB = a*(b-c+d+e_OB)
    Uz_UB = a*(b-c+d+e_UB)
    df_results['Uz (m)'] = np.select(conditions, [Uz_OB,Uz_OB,Uz_UB])   # calculation of Uz
    df_results['Uz (cm)'] = df_results['Uz (m)'] * 100
    Uz_end = df_results['Uz (m)'].iloc[-1]    # Extracting the end Uz value
    df_results['Vertical displacement (m)'] = df_results['Uz (m)'] - Uz_end    # Calculation of vertical displacement
    df_results['Vertical displacement (cm)'] = df_results['Vertical displacement (m)']*100
    df_results
    
results(Water_depth,e,intv,Top_res,Base_res,Res_thickness,Depletion, Biot,Cm,C,nu)

调用代码及报错信息

调用代码:

results(Water_depth,e,intv,Top_res,Base_res,Res_thickness,Depletion, Biot,Cm,C,nu)
df_results

报错信息:

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[11], line 33
     30     df_results
     32 results(Water_depth,e,intv,Top_res,Base_res,Res_thickness,Depletion, Biot,Cm,C,nu)
---> 33 df_results

NameError: name 'df_results' is not defined

问题原因

  • 函数无返回值:函数最后一行仅写了df_results,这只是在函数内部引用变量,没有使用return语句将其作为函数输出返回,所以调用函数后不会产生任何结果。
  • 局部变量无法外部访问:df_results是函数内部定义的局部变量,作用域仅限于函数内部,函数外部无法直接访问该变量,因此会触发NameError。

解决方法

  1. 在函数末尾添加return df_results,让函数执行完毕后返回生成的DataFrame。
  2. 调用函数时将返回值赋值给一个变量(比如df_results),之后即可正常访问该变量。

修改后的完整代码

import pandas as pd
import numpy as np

def results(Water_depth,e,intv,Top_res,Base_res,Res_thickness,Depletion, Biot,Cm,C,nu): 
    df_results = pd.DataFrame((np.arange(Water_depth,e,intv)), columns=['Depth'])   # Creating data frame for results
    df_results['Z (m)'] = ((df_results['Depth']) - Water_depth)/Top_res    # Creating normalised depth
    conditions = [
        (df_results['Depth'] < Top_res),
        (df_results['Depth'] >= Top_res) & (df_results['Depth'] <= Base_res),
        (df_results['Depth'] > Base_res)
        ]
    df_results['definition'] = np.select(conditions, ['Overburden','Reservoir','Underburden'])   # defining data points as either overburden, reservoir and underburden
    # Calculation of Uz (broken into smaller componants)
    Z = df_results['Z (m)']
    a = (Cm/2)*Res_thickness*Depletion*Biot
    b = (C*(Z-1))/pow(1+C*C*(Z-1)*(Z-1),(1/2))
    c = ((3-(4*nu))*C*(Z+1))/pow(1+C*C*(Z+1)*(Z+1),(1/2))
    d = (2*C*Z)/pow((1+C*C*(Z+1)*(Z+1)),(3/2))
    e_OB = 3-(4*nu)+1   # +1 used if overburden
    e_UB = 3-(4*nu)-1   # -1 used if underburden
    conditions = [
        (df_results['definition'] == 'Overburden'),
        (df_results['definition'] == 'Reservoir'),
        (df_results['definition'] == 'Underburden')
        ]
    Uz_OB = a*(b-c+d+e_OB)
    Uz_UB = a*(b-c+d+e_UB)
    df_results['Uz (m)'] = np.select(conditions, [Uz_OB,Uz_OB,Uz_UB])   # calculation of Uz
    df_results['Uz (cm)'] = df_results['Uz (m)'] * 100
    Uz_end = df_results['Uz (m)'].iloc[-1]    # Extracting the end Uz value
    df_results['Vertical displacement (m)'] = df_results['Uz (m)'] - Uz_end    # Calculation of vertical displacement
    df_results['Vertical displacement (cm)'] = df_results['Vertical displacement (m)']*100
    # 添加return语句返回DataFrame
    return df_results
    
# 调用函数并赋值给变量
df_results = results(Water_depth,e,intv,Top_res,Base_res,Res_thickness,Depletion, Biot,Cm,C,nu)
# 现在可以正常访问df_results
print(df_results)

内容的提问来源于stack exchange,提问作者travgeol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 08:57:49