当涉及不可变数据类型时,如何在Python中创建新命令?

时间:2017-09-02 04:50:33

标签: python

在Python中,以下代码打印' 0'而不是' 1'。

def inc(x):
    x = x+1

a = 0
inc(a)
print(a)

我理解为什么会发生这种情况;它是因为整数是不可变的。我不明白的是,当这种行为不受欢迎时,如何解决这个问题。假设我们要创建一个新命令,使代码

a = 0
inc(a)
print(a)

打印' 1'。

显然,天真的方法不会这样做。我们可以做些什么呢?

3 个答案:

答案 0 :(得分:0)

可以找到类似(更一般的)问题here以及Python如何将params传递给函数。简而言之,如果不将代码中的x变量作为对象,我相信我们无能为力。当然,您可以将代码更改为例如从函数inc()返回更改的值并打印它(即print(inc(x)))或者只是从inc()方法内部进行打印,但这不是你真正想要的。

答案 1 :(得分:0)

如果我理解正确,您正尝试使用函数a增加变量inc(var)并传递' a'作为function inc()的外部变量。

正如@Marko Andrijevic所说,传递给函数inc()的变量x和函数中定义的变量x是不同的。实现的一种方法是返回x的值并从外部收集,这可能不是你想要的。

或者,由于您已定义变量' a'在外部函数中,它可以被称为global变量。 如果要将其传递给函数并对其进行操作,则需要将函数内的变量(在您的情况下为' a')定义为global。像下面的东西。

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

现在,当新值分配给' a'在' x + 1'之后,它会在执行' inc(x)'

后保留
>>> a = 0
>>> inc(a)
>>> a
1

编辑-1
根据@DYZ的评论。这是正确的。在global a函数内声明inc()将始终递增a。 在这种情况下,更好的替代方案是return x内的inc()并将该值分配给任何外部变量。
不是一个优雅的解决方案,但按预期工作。

def inc(x):
    return x+1

结果

>>> a
0
>>> a = inc(a)
>>> a
1
>>> a = inc(a)
>>> a
2
>>> b = 0
>>> b = inc(b)
>>> b
1
>>> a
2
>>> 

答案 2 :(得分:0)

可以使用yield来获取变量值。

def inc(x,y,z):
    x += 1
    y+=1
    z+=1
    yield x,y,z          #inc doesn't stop
    yield x+y+z

a=b=c=0
gen=inc(a,b,c)
gen=list(gen)
a,b,c,sum=gen[0]+(gen[1],)     #however, index must still be known
print a,b,c,sum