Python函数内无for循环实现d=d+1及matplotlib绘图x轴递增问题
我来帮你搞定这两个问题——先解决x轴点不递增的bug,再聊聊怎么让变量d在函数调用间持续保持状态(哪怕不用for循环)。
问题根源分析
你现在的d是全局变量,但每次调用plot(d, money)时,传递的是d的当前值,而plot函数里修改的是局部变量d,不是全局的那个。所以每次调用plot时,传入的都是初始的-1,加1后变成0,所有点自然都堆在x=0的位置。
解决方案1:用全局变量(简单直接)
直接在plot函数里声明d是全局变量,这样修改的就是全局的d,不会每次重置:
import matplotlib.pyplot as plt %matplotlib inline d = -1 money = 40 def test(): for testing in range(5): # 这里可以加你的money变化逻辑,比如模拟金额变动 money += 10 # 示例:每次迭代金额加10 plot(money) # 不用传d了,直接用全局的d def plot(money): global d d += 1 plt.plot(d, money, 'o') test() plt.show() # 别忘了加这句显示图像
这样第一个点x=0,第二个x=1,以此类推,完全符合你的需求。
解决方案2:用闭包封装状态(更优雅,避免全局变量)
如果不想用全局变量污染命名空间,闭包是个好选择——它能把d的状态封装在内部,不会暴露出去:
import matplotlib.pyplot as plt %matplotlib inline money = 40 def create_plotter(): d = -1 # 这个d是闭包变量,会在每次调用时保留状态 def plotter(money): nonlocal d d += 1 plt.plot(d, money, 'o') return plotter # 创建一个自带状态的plot函数 plot = create_plotter() def test(): for testing in range(5): money += 10 plot(money) test() plt.show()
解决方案3:用类管理状态(适合复杂场景)
如果你的程序后续要扩展更多功能,用类来管理状态会更清晰:
import matplotlib.pyplot as plt %matplotlib inline class MoneyPlotter: def __init__(self): self.d = -1 # 用实例变量保存递增状态 def plot(self, money): self.d += 1 plt.plot(self.d, money, 'o') # 创建一个绘图实例 plotter = MoneyPlotter() money = 40 def test(): for testing in range(5): money += 10 plotter.plot(money) test() plt.show()
关于「无需for循环时让d递增」
上面的闭包和类方案天生就支持这个需求——哪怕你不用循环,单独调用plot函数,d也会自动从上一次的结果继续递增:
# 闭包示例:单独调用三次 plot(40) # x=0 plot(50) # x=1 plot(60) # x=2
完全不需要依赖循环,每次调用都会自动维护d的状态。
内容的提问来源于stack exchange,提问作者awakengaming83
相关产品推荐
相关产品推荐

