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())
在我的学校项目中,我正在比较搜索算法。对于 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())