[英]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中,基本数据类型按值传递-例如, int
, str
和bool
等按值传递
诸如classes
, enum
, list
, dict
classes
派生数据类型通过引用传递。
在您的示例中,问题在于您如何使用for循环-而不是function参数。 如果您这样做:
for val in lst:
val += 1
lst内部的值将不会更新,因为val
与lst[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.