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