【问题标题】:Create an unknown number of programmatically defined variables创建未知数量的程序定义变量
【发布时间】:2025-12-29 14:40:11
【问题描述】:

我有一个递归函数,它可以产生难以知道的表达式数量,每个表达式都需要乘以一个新变量。这些变量稍后将通过涉及积分或残差的计算去除。

如何开发这些未知数量的变量?也许被索引?我在互联网上看到的所有示例都在使用具有确定大小的先验已知对象,例如How can you dynamically create variables via a while loop?Accessing the index in Python 'for' loops 中的“项目”

我想我可以把它归结为这个简单的例子,以便在我的真实脚本中使用:

import sympy as s
p0,p1,p2,p3,p4=s.symbols('p0 p1 p2 p3 p4')
l = [p0, p1, p2, p3, p4]

def f(n):
    if n == 0:
        return l[n]
    elif n == 1: 
        return l[n]
    else:
        return f(n-1)*l[n]+f(n-2)

f(3) # works
f(6) # doesnt' work - need to define ahead of time the 
     # dummy variables l[6], l[5], .... 
     # even if they are just symbols for (much) later numerical evaluation.

我需要上面的 sn-p 来提前实际生成所需的未知数。

我看到有人提到熊猫,但找不到满足我需求的好例子,甚至不确定这是否是最佳途径。还看到了诸如“...未知数量的行 [文件]...”或“...未知数量的参数...”之类的内容,但这些似乎不适用。

【问题讨论】:

  • 虽然我对 python 很陌生,但我认为两者都需要知道大小......我需要像 Maxima 中的关键字 gensym() 之类的东西:maxima.sourceforge.net/docs/manual/maxima_33.html
  • list = [1, 2, 3], list.append(4) - 这是你想要达到的目标吗?
  • 好吧,在上面的sn-p中,如果我只是调用f(6),我希望通过提供一个虚拟变量来隐式地使用所需的l[6],以便计算可以继续。 ..
  • 如果 f(6) 不存在,你能不能创建一个辅助函数来返回一个虚拟值?
  • 所以如果我调用f(6),它将需要l[6] 存在。我可以启动一个包含 1000 个索引符号的列表(不知何故我不知道),或者我猜可能使用生成器或字典,这样内存就不会被征税,但也许我只是不知道该怎么做。调用f(6) 将需要l[6],然后是f(5)f(4),这将需要l[5]l[4],等等等等。所以也许你的想法可行,但我还不能确定。

标签: python variables recursion sympy


【解决方案1】:

Indexed objects 代表一个抽象事物,其索引可以取任何值,对索引的大小没有限制。

import sympy as s
p = s.IndexedBase("p")

def f(n):
    if n == 0 or n == 1:
        return p[n]
    else:
        return f(n-1)*p[n] + f(n-2)

print(f(7))

输出

(p[0] + p[1]*p[2])*p[3] + (((p[0] + p[1]*p[2])*p[3] + p[1])*p[4] + p[0] + p[1]*p[2])*p[5] + (((p[0] + p[1]*p[2])*p[3] + p[1])*p[4] + ((p[0] + p[1]*p[2])*p[3] + (((p[0] + p[1]*p[2])*p[3] + p[1])*p[4] + p[0] + p[1]*p[2])*p[5] + p[1])*p[6] + p[0] + p[1]*p[2])*p[7] + p[1]

顺便说一句,p0,p1,p2,p3,p4=s.symbols('p0 p1 p2 p3 p4') 之类的事情可以用syms = s.symbols('p0:5') 甚至

更轻松地完成
n = ...
syms = s.symbols('p0:{}'.format(n))

这会创建单个符号,而不是索引对象,因此在创建时必须知道数字 n。但仍然比列出 p0 p1 等更容易。

【讨论】:

  • 完美!谢谢!仍在阅读您提供的链接,但我确实注意到我可以使用这些对象,即f(7).subs(p[4],0)