问题描述
为什么我已经分配了它,却说“未定义名称'max_range'”。 这是对https://www.algoexpert.io/questions/Largest%20Range的问题的尝试 示例数组:
array = [1,11,3,15,5,2,4,10,7,12,6]
def largestRange(array):
# Write your code here.
sub_array = array # substitute array as it will be modified later3
Range = [0,0]
max_range = [0,0]
def run() :
global max_range
num = min(sub_array)
Range = [num]
running = True
while running :
num += 1
if num not in sub_array :
Range.append(num - 1)
running = False
pass
else :
sub_array.remove(num)
pass
pass
print(Range)
print(max_range)
if (max_range[1] - max_range[0]) <= (Range[1] - Range[0]) :
max_range = Range
if len(sub_array) != 0:
run()
pass
run()
print(max_range)
return max_range
pass
largestRange(array)
完整错误:
name 'max_range' is not defined
Traceback (most recent call last):
File "/tester/json_wrapper.py",line 9,in run
actual = program.largestRange(array[:])
File "/tester/program.py",line 30,in largestRange
run()
File "/tester/program.py",line 23,in run
print(max_range)
NameError: name 'max_range' is not defined
堆栈溢出表示我的问题主要是代码,所以我只是写了这一行,以便我发布问题
示例可复制代码:
def largestRange(array):
# Write your code here.
sub_array = array # substitute array as it will be modified later3
Range = [0,0]
def run():
global max_range
num = min(sub_array)
Range = [num]
running = True
while running:
num += 1
if num not in sub_array:
Range.append(num - 1)
running = False
pass
else:
sub_array.remove(num)
pass
pass
print(Range)
print(max_range)
if (max_range[1] - max_range[0]) <= (Range[1] - Range[0]):
max_range = Range
if len(sub_array) != 0:
run()
pass
run()
print(max_range)
return max_range
pass
largestRange([1,6])
解决方法
max_range
在全局范围内定义。因此,“通过默认”在函数的本地范围内也是可见的。
max_range = whatever
def run():
....
print(max_range) # OK
但是,将max_range = Range
置于函数内部 ,则将max_range
视为函数的 local 变量,即在所有函数中与全局max_range
max_range = whatever
def run():
....
print(max_range) # error,because local max_range has not been declared yet
max_range = Range # this makes max_range local
编辑(对已编辑的问题)
global
关键字适用于全局变量。在代码中,您在函数内部定义了max_range
(不在全局范围内),并且您想在内部函数内部进行更改。您可以实现此目标通过将其作为参数并返回修改后的值:
def largestRange(array):
...
max_range = [0,0]
def run(max_range):
... # the code you have
return max_range
max_range = run(max_range)
...
,
在Python中,默认情况下,分配给该变量的变量被视为局部变量...即在
中x = 3
def foo():
print(x) # <--- error: x is considered a local
# because of next statement,but at this
# point it has not yet received any value
x = 5
如果要更改全局变量,则需要通知编译器:
x = 3
def foo():
global x # <--- this informs x is global even if there are assignments
print(x) # <--- prints the global
x = 5 # <--- ok,this changes the global
如果从未写入变量,则编译器会假定它是从外部范围或全局范围捕获的。