我想在函数内初始化一个变量(以便我的示例中的最终打印语句输出 10):
def init_param(param):
param = 10
n = 1
init_param(n)
print n # prints 1
这在Python中可行吗?
参数在函数内部分配,因为它是局部变量。所以所有原则都适用于此。
您打算修改一个不可变的对象,这是不可能的。所以你唯一的选择是:-
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
首先,Python 函数通过对象传递值,这里的引用名称
param
只是对 n
所保存的值的引用。
现在来看解决方案,是的,只要您传递变量名称就可以实现
def init_param(var_name):
globals()[var_name] = 10
n = 1
init_param('n')
print n
希望能得到答复!
简短回答:不,你不能。
更长的答案:在
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 的文章)
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