繁体   English   中英

如何正确将参数传递给函数

[英]How do I properly pass an argument to a function

我来自C ++背景,因此这个问题对我来说似乎有点荒谬:让我们假设我有一个函数:

def scale(data, factor):
    for val in data:
        val *= factor

这无法按预期工作,如果我通过列表,它什么也不会改变,但是

def scale(data, factor):
    for index, val in enumerate(data):
        data[index] *= factor

并且lst = [val * factor for val in lst]正常工作。 Python如何处理参数传递? 我如何知道是否通过了实际的引用或别名?

如果要更改列表,则需要引用元素。 此版本使用map (可以使用列表推导来编写)

def scale(data, factor):
    return map(lambda x : x*factor, data)

lambda函数是anonymous函数。

>>> (lambda x : x + 1) (5)
6

在这种情况下, x代替变量5 + 1

因此,在这种情况下,我们遍历列表,将函数f(x) -> x * factor应用于列表的每个元素。 原始列表未更改,但我们返回了一个新版本。

在python中,基本数据类型按值传递-例如, intstrbool等按值传递

诸如classesenumlistdict classes派生数据类型通过引用传递。

在您的示例中,问题在于您如何使用for循环-而不是function参数。 如果您这样做:

for val in lst:
    val += 1

lst内部的值将不会更新,因为vallst[0]lst[1] ,依此类推,如果val是基本数据类型。 因此,即使在这里, val也按值复制。

第二,在您的示例中enumerate
但是,当您遍历enumerated列表时,将使用data[index] -修改实际列表中的元素。

最后,在您使用生成器的示例中:

lst = [val * factor for val in lst] -在这里,生成器循环遍历每个元素并创建一个新列表,该列表再次存储在lst 这类似于a = a + 2但扩展到列表。

之所以如此,是因为基本数据类型是通过值传递的,而派生数据类型(例如列表)是通过引用传递的,因此请考虑

>>> x = 24

>>> x + 1
25

>>> x
24

但另一方面有一个清单

>>> y = [1, 2, 3, 4]

>>> y.remove(2)

>>> y
[1,3,4]

因此,在使用基本数据类型的情况下,在对它们执行操作时,应始终小心地将值重新分配回去,并且对于通过引用传递的数据类型也要小心,因为您可能不知不觉地修改了变量

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM