用于更改对象的Python过程

时间:2016-02-01 05:18:26

标签: python

就像一个例子

def inc(a):
    a += 1

如果我想要一个增量函数或者写var += 1(不是唯一的情况,就像例子一样)我应该做什么? 我知道我可以return a + 1,但我希望void成功。 在python中有什么方法吗?

4 个答案:

答案 0 :(得分:3)

您可以通过a全局

来完成此操作
def add_one():
    global a
    a += 1

请注意,您不必将a传递给该函数。不过,我强烈建议不要这样做。

答案 1 :(得分:3)

Python数据模型并没有像其他语言那样拥有变量。它有可能与名称绑定的对象。所以Python"变量"不像许多其他语言那样存储位置,它只是对象上的标签。对象可能有多个名称,也可能没有。有关此主题的更多信息,请参阅SO退伍军人Ned Batchelder的Facts and myths about Python names and values

Python整数是不可变对象,因此您无法实际递增它们。当然,您可以创建一个新的整数对象,其值大于当前名为a的对象,并将名称a绑定到该新对象。

所以你要求做的事情并不完全是Python中的自然操作。但是,你可以近距离接触。正如其他人所提到的,您可以通过将a放入可变容器对象来进行排序。例如,

def inc(lst):
    lst[0] += 1

a = 7
b = [a]
inc(b)
print b, a

<强>输出

[8] 7

更令人满意的方法是通过global()字典引用名称:

def inc(k):
    globals()[k] += 1 

a = 7
inc('a')
print a

<强>输出

8

但是,通过globals()修改内容通常是不受欢迎的,如果你想修改一个函数的本地名称,它就没用了。

另一种选择是定义自定义类:

class MutInt(object):
    def __init__(self, v):
        self.v = v

    def __str__(self):
        return str(self.v)

    def inc(self):
        self.v += 1

a = MutInt(7)
print a
a.inc()
print a

<强>输出

7
8

但那仍然相当丑陋(恕我直言),你必须在其中定义int的所有方法才能使课程变得有用。

答案 2 :(得分:0)

您需要global语句来修改python中的global变量:

def inc(amount=1):
    global a
    a+=amount

a = 1
inc(2)
print(a)

这将允许函数覆盖全局定义变量的值。

答案 3 :(得分:0)

我们不能将int之类的不可变类型作为变量作为参考传递:How do I pass a variable by reference。但我们可以创建一个新类,并使用python的魔术类 __iadd__覆盖这个自我添加操作。

class CInt(object):

    x = 0

    def __init__(self, x):
        self.x = x

    def __add__(self, y):
        return CInt(self.x + y)

    def __iadd__(self, y):
        self.x = self.x + y


def inc(a):
    a += 1


a = CInt(2)

print(a.x)

inc(a)

print(a.x)

结果将是:

2
3