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
相关产品推荐
相关产品推荐

