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

如何在两个Python文件间传递循环中的y变量执行表达式?

问题描述

我有两个同一目录下的Python文件:randomvar.py和test_Random.py,代码分别如下:

randomvar.py 原代码

import numpy as np
from test_Random import call_random

def evaluate_expressions(expressions, x):
    def evaluate_expression(expr, x):
        return eval(expr)

    # Evaluate each expression in the list
    results = [evaluate_expression(expr, x) for expr in expressions]
    return results

f = ['x[0]**2*y+x[1]', 'x[0]-y*x[1]']

def func(x):
    return evaluate_expressions(f, x)

x = np.array([1,2])

call_random(func, x)

test_Random.py 原代码

import numpy as np

yy=np.array([3,4])
def call_random(ff, x):
    for i in range(2):
        y = yy[i]
        z = ff(x)
        print(z)

需求:每次在randomvar.py中调用call_random(func, x)时,让randomvar.py里的表达式使用test_Random.py循环生成的y=yy[i]值,需要做哪些修改?


修改方案

核心问题是y变量的作用域不互通,test_Random.py里的y无法被randomvar.py的eval直接访问,需要通过参数传递实现变量共享,具体修改如下:

1. 修改 test_Random.py

将循环生成的y作为参数传递给ff(即randomvar.py中的func):

import numpy as np

yy=np.array([3,4])
def call_random(ff, x):
    for i in range(2):
        y = yy[i]
        z = ff(x, y)  # 新增y参数传递
        print(z)

2. 修改 randomvar.py

调整相关函数的参数列表,接收并传递y,同时在eval时明确提供变量上下文:

import numpy as np
from test_Random import call_random

def evaluate_expressions(expressions, x, y):
    def evaluate_expression(expr, x, y):
        # 通过eval的局部变量字典,让表达式能访问x和y
        return eval(expr, {"x": x, "y": y})

    # 传递y给每个表达式的求值逻辑
    results = [evaluate_expression(expr, x, y) for expr in expressions]
    return results

f = ['x[0]**2*y+x[1]', 'x[0]-y*x[1]']

def func(x, y):  # 新增y参数
    return evaluate_expressions(f, x, y)

x = np.array([1,2])

call_random(func, x)

修改说明

  • 原代码中eval只能访问当前函数作用域内的变量,test_Random.py的y不在该作用域,直接调用会触发NameError。
  • 通过参数传递将y传入randomvar.py的求值函数,再通过eval的第二个参数(局部变量字典)明确提供x和y,确保表达式能正确解析这两个变量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 23:34:54