我想在函数内部初始化一个变量(以便我的示例中的最终print语句输出10):
def init_param(param):
param = 10
n = 1
init_param(n)
print n # prints 1
这在python中可行吗?
答案 0 :(得分:1)
参数在函数内部分配为局部变量。因此,所有原则都适用于此。
您正在缩进以修改不可变对象,这是不可能的。所以你唯一的选择是: -
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 :(得分:1)
首先,python函数按对象传递值,此处的引用名称param
只是对n
保持的值的引用。
现在找到解决方案,是的,只要您传递变量名称
就可以def init_param(var_name):
globals()[var_name] = 10
n = 1
init_param('n')
print n
希望它会回答!
答案 2 :(得分:1)
简短回答:不,你不能。
更长的答案:
def init_param(param):
param = 10
名称param
是init_param
函数的本地名称。重新绑定此名称将更改绑定到函数本地范围中名称param
的值,但对调用者范围中的名称n
完全没有影响 - 那些名称存在于完全不同的名称空间中。您可以read Ned Batcheler's reference article on Python's names and binding进行更深入的解释。
使用可变容器 - 例如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上面链接的文章)
答案 3 :(得分: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