问题
在某些语言中,可以使用特殊的保留字(如 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
复制代码
将会呈现
证明 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[0] = y[0]**2
- x = [5]
- foo(x)
- print x[0] # 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 = [1,2,3]
- clear_a(z) # z will not be changed
- clear_b(z) # z will be emptied
复制代码
|