【发布时间】:2026-01-15 15:40:01
【问题描述】:
作为一个新的python程序员,我有两个关于list的问题,非常感谢你的建议:
问题一:
对于以下代码:
nums1 = [1,2,3,8,0,0,0]
m = 3
nums2 = [2,5,6]
n = 3
def merge(nums1, m, nums2, n):
nums1[:] = sorted(nums1[:m]+nums2)
merge(nums1, m, nums2, n)
nums1
它的作用是:将list nums1和list nums2传递给merge函数,将它们与nums1中的前m项和nums2中的n项合并到list nums1中,并对list nums1进行排序。所以结果是: [1, 2, 2, 3, 5, 6] 所以我的问题是:既然 list nums1 是在函数合并范围之外定义的,它怎么有能力更新 nums1 呢?在下面的例子中:
x = 10
def reassign(x):
x = 2
reassign(x)
x
变量 x 是在函数 reassign 之外定义的,而 reassign 函数无法更新在 reassign 之外定义的 x,这就是 x 返回 10 的原因。
问题 2:
在上面我提供的代码中,如果我这样写:
注意:我只是在分配 sorted(nums1[:m]+nums2) 时将 nums1[:] 修改为 nums1
nums1 = [1,2,3,8,0,0,0]
m = 3
nums2 = [2,5,6]
n = 3
def merge(nums1, m, nums2, n):
nums1 = sorted(nums1[:m]+nums2)
merge(nums1, m, nums2, n)
nums1
nums1返回[1,2,3,8,0,0,0],所以我的问题是:在nums1后面加上[:]后,为什么函数有nums1的能力?该示例中的 [:] 是什么?
【问题讨论】:
-
赋值和变异不是一回事。
-
变量有范围,而不是对象。不同作用域的不同变量可以引用同一个对象,这就是传递参数时发生的情况
-
所以,简单地说,使用
nums[:] = whatever是一个mutator方法,并且sinve你的本地和全局变量都指的是同一个列表然后您会在局部变量中看到效果。阅读以下内容:nedbatchelder.com/text/names.html