[英]Merge two sorted lists
您好,我想问为什么当我在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]
谢谢
由于函数内部的变量具有局部作用域,因此您可以在函数中返回arr
并将函数结果分配给变量,请在函数末尾添加return arr
:
def main():
arr = [1, 5, 7, 2, 4, 6]
new=merge(arr, 0, 2, 5)
print(new)
但是请注意 ,在函数内部更改可变对象可能会影响调用者! 但是在这种情况下,您必须在arr = newArr
的末尾将newArr
分配给arr
,然后不更改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
初始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)
简而言之,当您将arr
传递给函数时,它引用的是内存中的列表,但与函数外部的arr
引用不同 (即使它们引用的是同一对象)。 在功能中,当您有
arr = newArr
本质上,您具有指向新对象的功能范围引用点,但没有功能外部的引用。
http://robertheaton.com/2014/02/09/pythons-pass-by-object-reference-as-explained-by-philip-k-dick/
如果您在函数内对arr
进行了突变 ,则由于它们引用的是同一对象,因此函数外的引用仍将引用该突变的对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.