python 中的递归函数看起来好像超出范围,但事实并非如此。我想念什么?
Recursive function in python looks like it's acting out of scope, but it is not. What do I miss?
我试图弄清楚下面的代码是如何工作的,
def mergeSort(a):
if len(a) > 1:
mid = len(a)//2
left = a[:mid]
right = a[mid:]
mergeSort(left)
mergeSort(right)
i = j = k = 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
a[k] = left[i]
i += 1
else:
a[k] = right[j]
j += 1
k += 1
while i < len(left):
a[k] = left[i]
i += 1
k += 1
while j < len(right):
a[k] = right[j]
j += 1
k += 1
return a
with Python tutor,当我注意到 while 循环操作上一次调用的 'A' 列表时。对我来说,它似乎超出了范围,但显然不是。
你能告诉我我遗漏了什么我认为它正在替换超出范围的列表元素吗?
没有所谓的“越界”。 python 的规则保证变量只能在范围内修改。
但是,有时多个变量引用同一个对象。在函数的情况下,这通常发生在通过引用传递时。这是一个例子:
def change_element(a):
a[1] = 42
x = list(range(10)
print(x)
change_element(x)
print(x)
在这里你会看到 x
的元素发生了变化,因为列表是通过引用传递给 change_element()
的。这意味着 x
和 a
都引用同一个列表对象。
您的示例实际上就是做这种事情。
我试图弄清楚下面的代码是如何工作的,
def mergeSort(a):
if len(a) > 1:
mid = len(a)//2
left = a[:mid]
right = a[mid:]
mergeSort(left)
mergeSort(right)
i = j = k = 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
a[k] = left[i]
i += 1
else:
a[k] = right[j]
j += 1
k += 1
while i < len(left):
a[k] = left[i]
i += 1
k += 1
while j < len(right):
a[k] = right[j]
j += 1
k += 1
return a
with Python tutor,当我注意到 while 循环操作上一次调用的 'A' 列表时。对我来说,它似乎超出了范围,但显然不是。
你能告诉我我遗漏了什么我认为它正在替换超出范围的列表元素吗?
没有所谓的“越界”。 python 的规则保证变量只能在范围内修改。
但是,有时多个变量引用同一个对象。在函数的情况下,这通常发生在通过引用传递时。这是一个例子:
def change_element(a):
a[1] = 42
x = list(range(10)
print(x)
change_element(x)
print(x)
在这里你会看到 x
的元素发生了变化,因为列表是通过引用传递给 change_element()
的。这意味着 x
和 a
都引用同一个列表对象。
您的示例实际上就是做这种事情。