【问题标题】:Local variable '...' referenced before assignment赋值前引用的局部变量“...”
【发布时间】:2017-01-18 22:08:44
【问题描述】:

我是 Python 新手,今天下午遇到了这个错误。我试图通过在previous 变量之前添加global 来解决此问题,但我继续收到此错误:

Traceback (most recent call last):
  File "send.py", line 76, in <module>
main(sys.argv[1:])
  File "send.py", line 34, in main
send()
  File "send.py", line 29, in send
    if data != previous:

我做的代码示例:

import socket
import sys
import getopt
import time
import threading

sys.path.insert(0, '/usr/lib/python2.7/bridge/') 

from bridgeclient import BridgeClient as bridgeclient

def main(argv):
    global bridge
    global previous

    try:                    
        # Create a UDP socket.
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        server_address = ('192.168.1.100', 9050)

        bridge = bridgeclient()
        previous = ""

        # Send data  
        def send():         
            data = bridge.get("data")   

            if data != previous:                    
                sent = sock.sendto(data, server_address)                                
                previous = data
                threading.Timer(0.2, send).start()

        send()

    finally:
        sock.close()

if __name__ == "__main__":
    main(sys.argv[1:])

【问题讨论】:

  • 您应该发布回溯,以便我们查看错误的详细信息。此外,BridgeClient 导入不太可能相关,但导致我们无法测试您的代码。发布一些较小的东西来证明这个问题。您可以复制此文件并删除其中的一半,包括套接字调用。
  • 不要使用global,也不要使用嵌套函数。
  • @tdelaney 我更新了我的帖子
  • @Daniel 我使用嵌套函数来控制定时器。也许我错了,但我在某处读到这种技术比 sleep() 函数更好。我不太了解 Python 中的良好做法(我是新手!)但如果你说嵌套函数是一种不好的做法,我会尽量避免这种做法!
  • @Daniel 这是一个相当广泛的声明。嵌套函数没有任何问题——它更恰当地称为“闭包”——尤其是在像计时器一样安排未来工作时。这个特定的实现需要一些修复,但总的来说它不是一个糟糕的策略。

标签: python python-2.7


【解决方案1】:

你在这里有嵌套范围:

def main(argv):
    ...
    global previous
    ...
    def send():
        ...
        if data != previous:

main 函数中声明全局不适用于send 函数中的局部。

您可以将previous 的全局声明移到send 方法的开头。您可以完全删除 bridge 的全局声明。

更好的是,重构代码不要使用嵌套范围和全局变量!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-02
    • 2011-11-06
    • 2018-01-12
    相关资源
    最近更新 更多