Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.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 UnboundLocalError:赋值和数组之前引用的局部变量“actionNumber”_Python - Fatal编程技术网

Python UnboundLocalError:赋值和数组之前引用的局部变量“actionNumber”

Python UnboundLocalError:赋值和数组之前引用的局部变量“actionNumber”,python,Python,如果以前有人问过这个问题,我真的很抱歉,但是对于我的案例,我似乎找不到解决这个错误的方法 我有一个屏幕坐标为x和y的文本文件,用新行分隔,我想读取该文件,并将文件的每一行存储到两个单独的数组中——一个用于x,一个用于y 然后我想使用pyautogui.moveTo移动到两个x和y坐标,然后单击我还没有做任何操作 变量actionNumber的作用就像for循环中的i,用于计算文本文件中的哪一行 如何在python中创建可以通过mainLoop读取的两个数组dataX[]和dataY[],然后将文

如果以前有人问过这个问题,我真的很抱歉,但是对于我的案例,我似乎找不到解决这个错误的方法

我有一个屏幕坐标为x和y的文本文件,用新行分隔,我想读取该文件,并将文件的每一行存储到两个单独的数组中——一个用于x,一个用于y

然后我想使用pyautogui.moveTo移动到两个x和y坐标,然后单击我还没有做任何操作

变量actionNumber的作用就像for循环中的i,用于计算文本文件中的哪一行

如何在python中创建可以通过mainLoop读取的两个数组dataX[]和dataY[],然后将文件中的一行数据存储到dataX[actionNumber],然后将文件的下一行存储到dataY[actionNumber]

这是我的代码,非常简单:

actionNumber = 0

dataX = []
dataY = []

f = open("track_cursor_position_log.txt", "r")
#print(f.read())


def mainLoop():
    #I need to store the first line of the file into dataX, then the second into dataY, then the 3rd into dataX, and so on...

    actionNumber = actionNumber + 1

    mainLoop()

mainLoop()
以下是我得到的错误:

Traceback (most recent call last):
  File "C:/Users/devel/Downloads/python-imagesearch-master/python-imagesearch-master/ClickAgentTest.py", line 17, in <module>
    mainLoop()
  File "C:/Users/devel/Downloads/python-imagesearch-master/python-imagesearch-master/ClickAgentTest.py", line 13, in mainLoop
    actionNumber = actionNumber + 1
UnboundLocalError: local variable 'actionNumber' referenced before assignment
如果这是一个noob问题,我再次道歉,但我更像是一个c++/JS程序员,而且我已经有一段时间没有使用python了


非常感谢所有能帮忙的人

因为您正在定义一个函数,所以它将对actionNumber的任何引用视为局部变量,该变量仅存在于函数中,与全局变量actionNumber没有连接

您可以将全局actionNumber添加为函数的第一行,这将使函数中对actionNumber的任何引用都是对全局actionNumber的引用,而不是对本地actionNumber的引用。但是,我建议您在函数中定义actionNumber为0,除非您需要在多个差分函数中/函数外部使用actionNumber

所以,您的固定代码可能是:

actionNumber = 0

dataX = []
dataY = []

f = open("track_cursor_position_log.txt", "r")
#print(f.read())


def mainLoop():
    #I need to store the first line of the file into dataX, then the second into dataY, then the 3rd into dataX, and so on...
    global actionNumber

    actionNumber = actionNumber + 1

    mainLoop()

mainLoop()


另外,顺便说一句,actionNumber+=1将与actionNumber=actionNumber+1相同。嗯,有几件事我会做得与您的方法不同。但是,要修复错误,需要引用全局变量actionNumber,而不是mainLoop命名空间中的本地实例。为此,请将以下内容添加到代码中:

def mainLoop():
    global actionNumber
    actionNumber = actionNumber + 1
代码的完整示例:

coords = []
f = open("track_cursor_position_log.txt", "r")
lines = f.readlines()
for item in lines:
   x,y = item.split(', ')
   coords.append([x,y])

for item in coords:
   pyautogui.moveto(item[0], item[1])

actionNumber不在mainLoop的范围内。你需要把它变成一个全局的,在函数中定义它,或者把它作为一个参数传入。明白了,我会尝试一下的,谢谢大家,顺便问一下,你有没有可能告诉我如何逐行读取文件,这样我就可以把每一行存储到dataX[actionNumber],然后把下一行存储到dataY[actionNumber]?很好,非常感谢您提供了非常有用和详细的答案!您是否可以告诉我如何逐行读取文件,这样我就可以将每一行存储到dataX[actionNumber],然后将下一行存储到dataY[actionNumber]?f.readlines会将您存储到f的文件分离到一个数组中,其中数组的每个元素都是文件的一行。然后,您可能会使用一些代码交替地将每一行存储到dataX和dataY中。明白了!非常感谢你的帮助!只是确认一下——对于Python中的数组,我是否需要在创建它们时立即用值填充它们?或者dataX=[]会简单地工作吗?那肯定会工作。我经常在代码中使用它,然后使用for循环来附加到它们。这是一个非常有用的功能,你一定要使用。非常感谢你的帮助!您是否可以告诉我如何逐行读取文件,以便我可以将每一行存储到dataX[actionNumber],然后将下一行存储到dataY[actionNumber]?当然!f、 readlines将在文件中创建一个行列表,每行以字符串形式存储。然后,您可以在第一个位置拆分每个字符串,并分别存储x和y值。我个人只需要创建一个名为coords的列表来存储值,并将其设置为:coords=[[x,y],[x2,y2],[x3,y3]…]
def mainLoop():
    global actionNumber
    actionNumber = actionNumber + 1
coords = []
f = open("track_cursor_position_log.txt", "r")
lines = f.readlines()
for item in lines:
   x,y = item.split(', ')
   coords.append([x,y])

for item in coords:
   pyautogui.moveto(item[0], item[1])