[软件设计/软件工程] 通过引用调用 Python 函数

[复制链接]
发表于 2022-5-5 09:10:26
问题
在某些语言中,可以使用特殊的保留字(如 ref 或 val)通过引用或值传递参数。当您将参数传递给 Python 函数时,它不会在您离开函数时更改参数的值,唯一的方法是使用全局保留字(或者按照我目前的理解)。

示例 1:
  1. k = 2

  2. def foo (n):
  3.      n = n * n     #clarity regarding comment below
  4.      square = n
  5.      return square

  6. j = foo(k)
  7. print j
  8. print k
复制代码

将会呈现
  1. >>4
  2. >>2
复制代码

证明 k 是常数

在这个例子中,变量 n 永远不会改变

示例 2:
  1. n = 0
  2. def foo():
  3.     global n
  4.     n = n * n
  5.     return n
复制代码

在此示例中,变量 n 已更改

Python中有没有办法调用函数并告诉Python参数是值或引用参数,而不是使用全局参数?

其次,在剑桥 A-level 考试中,他们现在说函数返回一个值,而过程返回多个值。在 80 年代我被教导一个函数有一个 return 语句而一个过程没有,为什么现在它不正确?

回答
在 Python 的函数中不能更改 str 或 tuple 等不可变对象,但您可以:
  1. def foo(y):
  2.   y[0] = y[0]**2

  3. x = [5]
  4. foo(x)
  5. print x[0]  # prints 25
复制代码

这是一种奇怪的方法,除非您需要始终对数组的某些元素进行平方。

请注意,在 Python 中,您还可以返回多个值,这使得传递引用的一些用例变得不那么重要:
  1. def foo(x, y):
  2.    return x**2, y**2

  3. a = 2
  4. b = 3
  5. a, b = foo(a, b)  # a == 4; b == 9
复制代码

当您返回此类值时,它们将作为元组返回,然后将其解包。

编辑:

另一种思考方式是,虽然您不能在 Python 中通过引用显式传递变量,但您可以修改传入对象的属性。在我的示例(和其他示例)中,您可以修改传入列表的成员。但是,您将无法完全重新分配传入的变量。例如,请参阅以下两段代码,它们看起来可能会做类似的事情,但最终会得到不同的结果:
  1. def clear_a(x):
  2.   x = []

  3. def clear_b(x):
  4.   while x: x.pop()

  5. z = [1,2,3]
  6. clear_a(z) # z will not be changed
  7. clear_b(z) # z will be emptied
复制代码






上一篇:WampServer-mysqld.exe无法启动,缺少 MSVCR120.dll
下一篇:Python/Pandas 计算 Ichimoku 图表组件

使用道具 举报

Archiver|手机版|小黑屋|吾爱开源 |网站地图

Copyright 2011 - 2012 Lnqq.NET.All Rights Reserved( ICP备案粤ICP备14042591号-1粤ICP14042591号 )

关于本站 - 版权申明 - 侵删联系 - Ln Studio! - 广告联系

本站资源来自互联网,仅供用户测试使用,相关版权归原作者所有

快速回复 返回顶部 返回列表