您好我想问为什么当我在arr
下面运行此代码时,没有更改它的值
def merge(arr, left, middle, right):
newArr = []
leftCounter = 0
rightCounter = middle + 1
while leftCounter <= middle and rightCounter <= right:
if arr[leftCounter] < arr[rightCounter]:
newArr.append(arr[leftCounter])
leftCounter += 1
else:
newArr.append(arr[rightCounter])
rightCounter += 1
while leftCounter <= middle:
newArr.append(arr[leftCounter])
leftCounter += 1
while rightCounter <= right:
newArrCounter.append(arr[rightCounter])
rightCounter += 1
arr = newArr
def main():
arr = [1, 5, 7, 2, 4, 6]
merge(arr, 0, 2, 5)
print(arr)
结果是[1,5,7,2,4,6]
感谢
答案 0 :(得分:0)
由于函数内部的变量具有局部范围。您可以在函数中返回arr
并将函数结果赋值给变量,在函数的尾随处添加return arr
:
def main():
arr = [1, 5, 7, 2, 4, 6]
new=merge(arr, 0, 2, 5)
print(new)
但是 note 更改函数内部的可变对象可能会影响调用者!但在这种情况下,您已在newArr
结束时将arr
分配给arr = newArr
,然后您不会更改arr,例如,请参阅以下示例:
>>> def a(arr):
... arr = [3,4]
>>> x=[5]
>>> a(x)
>>> x
[5]
>>> def a(arr):
... arr+= [3,4]
...
>>> a(x)
>>> x
[5, 3, 4]
在第一个状态中,我们已经为名称arr
分配了一个新对象,因此python将在函数a
的本地名称空间中创建一个局部变量!但在第二种情况下,我们更改了名称arr
,而arr
是一个可变对象,python不会创建新对象,而是全局更改名称arr
!
或者您可以将newArr
初始化为全局,然后您可以在main函数中打印它:
def merge(arr, left, middle, right):
global newArr
newArr = []
leftCounter = 0
rightCounter = middle + 1
while leftCounter <= middle and rightCounter <= right:
if arr[leftCounter] < arr[rightCounter]:
newArr.append(arr[leftCounter])
leftCounter += 1
else:
newArr.append(arr[rightCounter])
rightCounter += 1
while leftCounter <= middle:
newArr.append(arr[leftCounter])
leftCounter += 1
while rightCounter <= right:
newArrCounter.append(arr[rightCounter])
rightCounter += 1
arr = newArr
def main():
arr = [1, 5, 7, 2, 4, 6]
merge(arr, 0, 2, 5)
print(newArr)
答案 1 :(得分:0)
简单地说,当你将arr
传递给函数时,它会在内存中引用一个列表,但它的与函数外的arr
不一样的引用(即使他们指的是同一个对象)。在功能中,当你有
arr = newArr
基本上你有新的对象的函数范围引用点,但不是函数外的引用。
http://robertheaton.com/2014/02/09/pythons-pass-by-object-reference-as-explained-by-philip-k-dick/
如果你在函数中 mutate arr
,因为它们引用同一个对象,函数外部的引用仍将引用变异对象。