如何在Python中为函数参数赋值

问题描述 投票:0回答:4

我想在函数内初始化一个变量(以便我的示例中的最终打印语句输出 10):

def init_param(param):
    param = 10

n = 1
init_param(n)
print n                   # prints 1

这在Python中可行吗?

python
4个回答
4
投票

参数在函数内部分配,因为它是局部变量。所以所有原则都适用于此。

  • 不可变对象无法更改。
  • 可以就地修改可变对象。

您打算修改一个不可变的对象,这是不可能的。所以你唯一的选择是:-

def init_param(param):
    param = 10
    return param

n = 1
n = init_param(n)
print n

这几乎没用或者

def init_param(param):
    param[0] = 10

n = [1]
init_param(n)
print n   

1
投票

首先,Python 函数通过对象传递值,这里的引用名称

param
只是对
n
所保存的值的引用。

现在来看解决方案,是的,只要您传递变量名称就可以实现

def init_param(var_name):
    globals()[var_name] = 10

n = 1
init_param('n')
print n

希望能得到答复!


1
投票

简短回答:不,你不能。

更长的答案:在

def init_param(param):
    param = 10

名称

param
init_param
函数的局部名称。重新绑定此名称将更改绑定到函数局部作用域中的名称
param
的值,但对调用者作用域中的名称
n
绝对没有影响 - 这些名称位于完全不同的命名空间中。您可以阅读 Ned Batcheler 关于 Python 名称和绑定的参考文章以获得更深入的解释。

有效的方法是使用可变容器 - 例如

dict
- 并改变这个容器,即:

def init_param(params, name, value):
    params[name] = value

params = {
   "n": 1,
   "answer": 42,
   "parrot": "dead"
   }

init_params(params, "n", 10)
print(params)

(如果您不明白为什么这个有效,请重新阅读上面链接的 Ned Batcheler 的文章)


0
投票
def init_param(param):
    param = 10

n = 1
init_param(n)
print n 

这里

n
是一个整数(
immutable data type
),所以它将按值传递,因此n的值将保持不变。

让我们采用一个

mutable data type
(例如列表),然后它将通过引用传递,因此列表中的值将被更改。

def init_param(a):
    a[0] = 10

arr = [1] 
init_param(arr)
print(arr[0]) # print 10

所以你必须首先检查数据是可变的还是不可变的。

否则您可以使用

global keyword
访问
global variables

def f():
    global n
    n = 10
n = 1
f()
print(n) # print 10
© www.soinside.com 2019 - 2024. All rights reserved.