52ky 发表于 2022-5-5 09:10:26

通过引用调用 Python 函数

问题
在某些语言中,可以使用特殊的保留字(如 ref 或 val)通过引用或值传递参数。当您将参数传递给 Python 函数时,它不会在您离开函数时更改参数的值,唯一的方法是使用全局保留字(或者按照我目前的理解)。

示例 1:
k = 2

def foo (n):
   n = n * n   #clarity regarding comment below
   square = n
   return square

j = foo(k)
print j
print k
将会呈现
>>4
>>2
证明 k 是常数

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

示例 2:
n = 0
def foo():
    global n
    n = n * n
    return n
在此示例中,变量 n 已更改

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

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

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

x =
foo(x)
print x# prints 25
这是一种奇怪的方法,除非您需要始终对数组的某些元素进行平方。

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

a = 2
b = 3
a, b = foo(a, b)# a == 4; b == 9
当您返回此类值时,它们将作为元组返回,然后将其解包。

编辑:

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

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

z =
clear_a(z) # z will not be changed
clear_b(z) # z will be emptied



页: [1]
查看完整版本: 通过引用调用 Python 函数