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

Python函数无法修改整数变量值,求技术解决方案

问题:函数内修改整数变量后全局变量未更新

问题原因

Python中不可变类型(如int、str、tuple)的参数传递是按值传递。你在ereter函数里接收的ez、r、e是局部变量,只是全局变量当前值的副本。函数内对这些变量的修改只会作用于局部,不会影响全局作用域的同名变量,所以每次循环调用时,传入的始终是初始的ez=0、r=0、e=8,导致全局的ez永远不会变化。

另外你的代码还遗漏了oled对象的初始化,需要补充创建实例的代码。

解决方案

方案1:使用global关键字声明全局变量

修改函数,明确告知函数要操作全局作用域的变量,不需要再传参数:

# 补充oled初始化
oled = ssd1306.SSD1306_I2C(WIDTH, HEIGHT, i2c)

def ereter():
    global ez, r, e  # 声明使用全局变量
    ez += 1
    print(ez)
    oled.fill(0)
    oled.text("{}".format(ez), 35, 10)
    oled.text(":{}".format(r), 50, 10)
    oled.text(":{}".format(e), 72, 10)
    oled.text("The time is ^ rn", 0, 30)
    oled.text("i2c devices:"+str(i2c.scan()), 0, 40)
    oled.show()
    if ez>58: r+=1
    if ez>58: ez-=60
    if r>58: e+=1
    if r>58: r-=60
    if e>11: e-=12

while nah>1:
    ereter()  # 无需传参
    time.sleep(1)

方案2:让函数返回修改后的变量,在全局作用域更新

保持函数参数传递,最后返回修改后的变量值,循环中接收并更新全局变量:

# 补充oled初始化
oled = ssd1306.SSD1306_I2C(WIDTH, HEIGHT, i2c)

def ereter(ez, r, e):
    ez += 1
    print(ez)
    oled.fill(0)
    oled.text("{}".format(ez), 35, 10)
    oled.text(":{}".format(r), 50, 10)
    oled.text(":{}".format(e), 72, 10)
    oled.text("The time is ^ rn", 0, 30)
    oled.text("i2c devices:"+str(i2c.scan()), 0, 40)
    oled.show()
    if ez>58: r+=1
    if ez>58: ez-=60
    if r>58: e+=1
    if r>58: r-=60
    if e>11: e-=12
    return ez, r, e  # 返回修改后的变量

while nah>1:
    ez, r, e = ereter(ez, r, e)  # 更新全局变量
    time.sleep(1)

注意事项

  • 方案1适合简单场景,但过度使用global会降低代码可读性,大型项目建议避免。
  • 方案2更符合函数的封装原则,通过返回值传递状态,代码更易维护。

内容的提问来源于stack exchange,提问作者hello i couldnt think of a goo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 04:35:17