NameError: Name 'trys1' is not defined

NameError: Name 'trys1' is not defined

在我的学校项目中,我正在比较搜索算法。对于 36 到 65 之间的搜索数字,我没有收到错误消息。Above/below 这个数字范围发生错误(NameError:名称 'trys1' 未定义)。我不知道为什么。我试图在定义之后直接调用 def,因为它已解决了类似的问题,但它不起作用。我应该怎么办?如果从 def 图中删除 try1,则不再出现该错误。

import math
from Suche.SucheZahlen import Zahlen
import matplotlib.pyplot as plt

index1 = []
index2 = []
index3 = []
data0 = Zahlen.data
length = len(data0) - 1


def suche(number, x, right, length, data0):
    global index1
    global trys1
    runtime = int(math.log2(length))
    for i in range(runtime + 1):
        if data0[x] <= number <= data0[right]:
            median_index = int((length + x) / 2 - 1)
            index1.append(median_index)
            if number == data0[median_index]:
                print("ja")
                trys1 = i + 1
                break
            if number - 1 > data0[median_index]:
                x = median_index + 1
            elif number - 1 < data0[median_index]:
                length = median_index + 1
            elif number - 1 == data0[median_index]:
                print("ja")
                break
        else:
            print("nein")
            break


def intervallsuche(number, right, left, data0):
    global trys2
    for i in range(right):
        if data0[left] <= number <= data0[right]:
            x = left + (number - data0[left]) / (data0[right] - data0[left]) * (right - left)
            round = x % 1
            if round < 0.5:
                x = int(x)
            if round >= 0.5:
                x = int(x) + 1
            index2.append(x)
            if data0[x] == number:
                trys2 = i + 1
                print("ja")
                break
            if data0[x] > number:
                right = right - 1
            if data0[x] < number:
                left = left + 1
        else:
            print("nein")
            break


def linearesuche(number, x, right, data0):
    global trys3
    if data0[x] <= number <= data0[right]:
        for i in range(right):
            if number == data0[x]:
                trys3 = i
                print("ja")
                break
            else:
                x = x + 1
            index3.append(x)
    else:
        print("nein")


def diagramm():
    x1 = list(range(trys1))
    x2 = list(range(trys2))
    x3 = list(range(trys3))
    x4 = [0, length]
    y1 = index1
    y2 = index2
    y3 = index3
    y4 = [number, number]
    xmin = 0
    xmax = trys3
    ymin = 0
    ymax = data0[100]
    plt.axis([xmin, xmax, ymin, ymax])
    plt.scatter(x1, y1)
    plt.scatter(x2, y2)
    plt.scatter(x3, y3)
    plt.plot(x4, y4)
    plt.xlabel("X")
    plt.ylabel("Y")
    plt.show()


number = int(input("number:"))
linearesuche(number, 0, length, data0)
intervallsuche(number, length, 0, data0)
suche(number, 0, length, length, data0)
diagramm()

首先,一些代码反馈:你几乎不应该为任何事情使用全局变量。您实际上需要它们的情况极为罕见,如果您不小心,它们会导致各种命名空间问题 - 这就是一个例子。

实际问题:您实际上并没有在 suche 函数之外创建一个名为 trys1 的全局变量。需要在全局命名空间上定义全局变量,然后在函数内部调用它们只是告诉 Python 您正在尝试修改该全局变量,而不是新的局部变量。

如果这让您感到困惑,希望下面的示例能够说明问题。下面的代码将 return 2,因为你告诉 foo 函数你正在尝试修改上面定义的 c,而不是你创建的本地 c在功能范围内。

c = 1
def foo():
  global c
  c = c+1
  return c

print(foo())

这一次,下面的代码应该给出与您收到的相同的 NameError(虽然我还没有测试过),因为您试图告诉 foo 函数修改全局变量c,但没有全局变量c

def foo():
  global c
  c = c+1
  return c

print(foo())

现在,下面的代码将简单地修改函数内的 c 变量。

def foo():
  c = 1
  c = c+1
  return c

print(foo())