Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么在赋值之前要引用局部变量?_Python_Python 3.x_Exception - Fatal编程技术网

Python 为什么在赋值之前要引用局部变量?

Python 为什么在赋值之前要引用局部变量?,python,python-3.x,exception,Python,Python 3.x,Exception,我得到了一个错误,我花了几个小时试图理解为什么会发生这种情况,但我无法理解 以下是我的代码,在我断开internet之前,它可以正常工作,没有任何问题(这就是为什么我在internet断开连接时破例继续重试),当internet断开连接时,异常将继续调用该函数,当internet返回时,它将继续该函数,但随后抛出一些错误: [Errno-2]名称或服务未知 UnboundLocalError:赋值前引用的局部变量“ip” from time import sleep from requests_

我得到了一个错误,我花了几个小时试图理解为什么会发生这种情况,但我无法理解

以下是我的代码,在我断开internet之前,它可以正常工作,没有任何问题(这就是为什么我在internet断开连接时破例继续重试),当internet断开连接时,异常将继续调用该函数,当internet返回时,它将继续该函数,但随后抛出一些错误: [Errno-2]名称或服务未知 UnboundLocalError:赋值前引用的局部变量“ip”

from time import sleep
from requests_html import HTMLSession

public_ip = ""

def get_ip():
    global public_ip
    session = HTMLSession()

    try:
        ip = session.get('https://api.ipify.org').text
    except:
        print("Exception started... Retrying")
        sleep(10)
        get_ip()

    if ip == public_ip:
        print("It's the same")
    else:
        print("new IP")
        print("Old " + public_ip)
        print(ip)
        public_ip = ip
        print("new " + public_ip)


while True:
    get_ip()
    sleep(10)


当没有internet时,变量
ip
的赋值不起作用,这就是为什么会出现错误,请尝试在try语句之前初始化变量ip:

def get_ip():
global public_ip
session = HTMLSession()
ip = ""
try:
    ip = session.get('https://api.ipify.org').text
except:
    print("Exception started... Retrying")
    sleep(10)
    get_ip()
...

假设您点击了除之外的
,则未分配
ip。然后递归调用
get\u ip
,然后在某个点返回,在这种情况下,如果ip==public\u ip,代码将移到
,但它仍然没有定义。首先,我会避免递归。。。使用循环。或者,只需将
ip
初始化为
None
或一些有意义的默认值