将列表传递给Python函数

2024-04-25 22:54:06 发布

您现在位置:Python中文网/ 问答频道 /正文

作为一名新的python程序员,我对列表有两个问题,非常感谢您的建议:

问题1:

对于以下代码:

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是在函数merge的范围之外定义的,那么它为什么能够更新nums1呢?在下面的例子中:

x = 10
def reassign(x):
    x = 2
reassign(x)
x

变量x是在函数重新分配之外定义的,重新分配函数无法更新在重新分配之外定义的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的能力?在那个例子中[:]是什么意思?你知道吗


Tags: 函数代码列表定义排序defmerge建议
3条回答

如果你感到困惑,请采取以下措施。你知道吗

首先,位置和变化不是一回事

nums1 = [1,2,3,8,0,0,0]
lst = None
m = 3
nums2 = [2,5,6]
n = 3
def merge(nums1, m, nums2, n):
    global lst 
    lst = sorted(nums1[:m]+nums2)
merge(nums1, m, nums2, n)
print(lst)

nums1[:]表示您的整个列表。 如果使用nums1[:]而不是nums1,则可以使用sorted(nums1[:m]+nums2)更改以前的nums1[:]列表。当你这样做的时候,你的前一个和最新的列表都改变了,所以你在nums1数组列表中用新的附加变量来改变new的位置。但是,如果只使用nums1而不是nums1[:],那么最新的nums1现在引用的列表与前者不同。你知道吗

(不要使用[:]的东西。太可怕了。)

我的非正式回答

当您说nums1[:]Python正在查找名为nums1的全局列表时。 然而,在函数的内部,Python首先关注新的变量。为什么?
-如果你从一个函数中提取的任何变量名现在被限制在函数中用作不同的变量,那就糟了

H = True # some variable.pretend it means "High"

def euro_height(inches):
    H = inches # since H is a nice abbrev for height in inches
    return H*2.54 # Centimeters

我不希望函数中的H覆盖我已经存储的内容。因此,在euro_height中,H被认为是一个不同的局部变量,只有该函数才能看到和使用它。如果我想从函数外部使用H,我必须首先告诉Python访问它。那我就可以用了。你知道吗

H = True # some variable.pretend it means "High"

def euro_height(inches):
    global H
    print(H) # will say true

    renamed_var = inches # since H is a nice abbrev for height in inches
    return renamed_var*2.54 # Centimeters

如果我现在在函数中赋值H = inches,它将覆盖全局HTrue值。因此,我将其重命名,因为已经有了我想要使用的H。你知道吗

所有这些的名称称为名称空间。希望您正在学习Python教程。当他们教授函数时,你就会明白这一点。如果你不喜欢,我建议你做个辅导

有关这个答案的更多信息,请看这里的交互式示例https://www.programiz.com/python-programming/global-local-nonlocal-variables

另外,不要再使用mylist[:]。=)语法不好。 它只返回整个列表。所以只要使用列表的名称mylist。通过添加括号,您强制查找全局var,并产生了问题

要复制您所说的内容,请执行以下步骤:

var = 10
lst = [1, 2, 3]

def func():
    var = 11
    lst[:] = [1, 2, 3, 4]

func()
print(var, lst) 

以上将输出10 [1, 2, 3, 4]。现在注意以下几点:

var = 10
lst = [1, 2, 3]

def func():
    print(var)
    print(lst)

func()

输出10 [1, 2, 3],所以我们知道函数可以访问全局变量,但在大多数情况下不能修改它们。现在让我们看看这两种情况(intlist):下面是这两种情况:

  1. 由于局部作用域和全局作用域之间的引用不同,var变量没有被修改(虽然我们可以访问全局作用域,但不能修改它)。我建议你玩玩打印globals()locals()来获得乐趣。如果我们做到以下几点,这种情况是可以解决的:
def func():
    global var
    var = 11
  1. 正在使用[:]表示法修改lst变量,因为作为引用的here,片分配[:]使用operator函数setitem()。因此,从技术上讲,lst[:] =相当于:
from operator import setitem

lst = [1, 2, 3]

# Both of these are equivalent. 
lst[:] = [1, 2, 3, 4] 
setitem(a, slice(0, len(a)), [1, 2, 3, 4])

setitem不区分局部作用域和全局作用域。你知道吗

相关问题 更多 >