我正面临以下问题; 假设我有以下内容:
a = 0
def something(variable):
variable = variable + 1
something(a)
print(a)
输出为0而不是1 ..
如果我在函数内使用“全局变量”行,程序会显示以下错误:
“name'a'是参数和全局”
任何提示如何使这项工作?或者在Python中不可能吗?
答案 0 :(得分:3)
变量输入函数作为参数,并将它们保留为返回值:
def something(variable)
variable += 1
return variable
a = 0
a = something(a)
print(a)
答案 1 :(得分:0)
Python没有void func(int * a)
或void func(int & a)
的概念等价物,可以在C-like中用作'输入/输出'参数。虽然python中的方法参数是pass-by-reference,但所有数值类型都是不可变的,因此更改数值变量值的唯一方法是通过赋值,该赋值为该名称创建新引用,而不是更改现有值
从示例中更改a
值的最简单方法当然是将返回值分配给输入:
a = do_something(a)
潜在的问题是,任何混淆a
的东西都不会反映变化,I.E。
a = 0
b = a
a = do_something(a)
print(a)
>>> 1
print(b)
>>> 0
要获得与int * a
相同的行为,您必须将数值包装在一个简单的可变数据结构中,如list / dict,或放入类中。以下示例:
class mutable_number(object):
def __init__(value):
self._value = value
@property
def value(self):
return self._value
@value.setter
def value(self, value):
self._value = value
list_a = [0]
dict_a = {'a':0}
class_a = mutable_number(0)
def do_something_l(lst):
lst[0] += 1
def do_something_d(dct):
dct['a'] += 1
def do_something_c(cls):
cls.value += 1
do_something_l(list_a)
do_something_d(dict_a)
do_something_c(class_a)
print(list_a[0])
print(dict_a['a'])
print(class_a.value)
>>> 1
>>> 1
>>> 1
这些表单都可以正常使用别名,所以如果我已经完成了
class_a = mutable_number(0)
class_b = class_a
然后在最后
print(class_b.value)
>>> 1
您获得了预期的输出。
要记住的另一件事是python支持通过元组进行多次返回的简单语法:
return a,b,c
Exceptions被认为是很好的编程风格,所以很多用于C-like中'in / out'参数的许多用例都不是必需的(EX:Alter输入参数,返回错误代码或改变多个输入参数)在void
)