作为一名新的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的能力?在那个例子中[:]是什么意思?你知道吗
如果你感到困惑,请采取以下措施。你知道吗
首先,位置和变化不是一回事
nums1[:]
表示您的整个列表。 如果使用nums1[:]
而不是nums1
,则可以使用sorted(nums1[:m]+nums2)
更改以前的nums1[:]
列表。当你这样做的时候,你的前一个和最新的列表都改变了,所以你在nums1
数组列表中用新的附加变量来改变new的位置。但是,如果只使用nums1
而不是nums1[:]
,那么最新的nums1
现在引用的列表与前者不同。你知道吗(不要使用
[:]
的东西。太可怕了。)我的非正式回答
当您说
nums1[:]
Python正在查找名为nums1
的全局列表时。 然而,在函数的内部,Python首先关注新的变量。为什么?-如果你从一个函数中提取的任何变量名现在被限制在函数中用作不同的变量,那就糟了
我不希望函数中的
H
覆盖我已经存储的内容。因此,在euro_height
中,H
被认为是一个不同的局部变量,只有该函数才能看到和使用它。如果我想从函数外部使用H
,我必须首先告诉Python访问它。那我就可以用了。你知道吗如果我现在在函数中赋值
H = inches
,它将覆盖全局H
的True
值。因此,我将其重命名,因为已经有了我想要使用的H
。你知道吗所有这些的名称称为名称空间。希望您正在学习Python教程。当他们教授函数时,你就会明白这一点。如果你不喜欢,我建议你做个辅导
有关这个答案的更多信息,请看这里的交互式示例https://www.programiz.com/python-programming/global-local-nonlocal-variables
另外,不要再使用
mylist[:]
。=)语法不好。 它只返回整个列表。所以只要使用列表的名称mylist
。通过添加括号,您强制查找全局var,并产生了问题要复制您所说的内容,请执行以下步骤:
以上将输出
10 [1, 2, 3, 4]
。现在注意以下几点:输出
10 [1, 2, 3]
,所以我们知道函数可以访问全局变量,但在大多数情况下不能修改它们。现在让我们看看这两种情况(int
和list
):下面是这两种情况:var
变量没有被修改(虽然我们可以访问全局作用域,但不能修改它)。我建议你玩玩打印globals()
和locals()
来获得乐趣。如果我们做到以下几点,这种情况是可以解决的:[:]
表示法修改lst
变量,因为作为引用的here,片分配[:]
使用operator
函数setitem()
。因此,从技术上讲,lst[:] =
相当于:setitem
不区分局部作用域和全局作用域。你知道吗相关问题 更多 >
编程相关推荐