【问题标题】:Global variable declaration + Unbound Error: local variable referenced before assignment?全局变量声明+未绑定错误:分配之前引用的局部变量?
【发布时间】:2019-03-04 21:34:53
【问题描述】:

我已截断以下代码。它是物联网液体流量计演示的一部分(因此是 GPIO 参考)。运行它时,该函数似乎忽略了变量旋转已被定义为全局变量

import RPi.GPIO as GPIO
import time, sys

LIQUID_FLOW_SENSOR = 32

GPIO.setmode(GPIO.BOARD)
GPIO.setup(LIQUID_FLOW_SENSOR, GPIO.IN, pull_up_down = GPIO.PUD_UP)

global rotation
rotation = 0

def countPulse(channel):
   rotation = rotation+1
   print ("Total rotation = "+str(rotation))
   litre = rotation / (60 * 7.5)
   two_decimal = round(litre,3)
   print("Total consumed = "+str(two_decimal)+" Litres")

GPIO.add_event_detect(LIQUID_FLOW_SENSOR, GPIO.FALLING, callback=countPulse)

while True:
    try:
        time.sleep(1)

    except KeyboardInterrupt:
        print 'Program terminated, Keyboard interrupt'
        GPIO.cleanup()
        sys.exit()

错误:

Unbound Error: local variable 'rotation' referenced before assignment

如何以全局方式声明变量而不在每次调用 countPulse 时将其重置为零?

PS:回调和通道变量在这里解释:https://sourceforge.net/p/raspberry-gpio-python/wiki/Inputs/

【问题讨论】:

  • 你在错误的地方使用了global。它位于您希望 rotation 被视为全局而非本地名称的函数中。

标签: python python-3.x raspberry-pi global-variables gpio


【解决方案1】:

只需在函数中将其声明为全局即可。

def countPulse(channel): 
  global rotation 
  rotation = rotation+1
  ...

【讨论】:

    【解决方案2】:

    我想通了。虽然您打算定义的变量保留一个全局范围,但需要在函数内部单独声明它是一个全局范围。 'global' 命令不能在函数之外。

    import RPi.GPIO as GPIO
    import time, sys
    
    LIQUID_FLOW_SENSOR = 32
    
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(LIQUID_FLOW_SENSOR, GPIO.IN, pull_up_down = GPIO.PUD_UP)
    
    rotation = 0
    
    def countPulse(channel):
       global rotation
       rotation = rotation+1
       print ("Total rotation = "+str(rotation))
       litre = rotation / (60 * 7.5)
       two_decimal = round(litre,3)
       print("Total consumed = "+str(two_decimal)+" Litres")
    
    GPIO.add_event_detect(LIQUID_FLOW_SENSOR, GPIO.FALLING, callback=countPulse)
    
    while True:
        try:
            time.sleep(1)
    
        except KeyboardInterrupt:
            print 'Program terminated, Keyboard interrupt'
            GPIO.cleanup()
            sys.exit()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-16
      • 1970-01-01
      • 2016-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多