用于更改变量值的函数

时间:2014-12-13 19:34:13

标签: python

我正面临以下问题; 假设我有以下内容:

a = 0

def something(variable):
    variable = variable + 1

something(a)

print(a)

输出为0而不是1 ..

如果我在函数内使用“全局变量”行,程序会显示以下错误:

  

“name'a'是参数和全局”

任何提示如何使这项工作?或者在Python中不可能吗?

2 个答案:

答案 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