在Python中,以下代码打印' 0'而不是' 1'。
def inc(x):
x = x+1
a = 0
inc(a)
print(a)
我理解为什么会发生这种情况;它是因为整数是不可变的。我不明白的是,当这种行为不受欢迎时,如何解决这个问题。假设我们要创建一个新命令,使代码
a = 0
inc(a)
print(a)
打印' 1'。
显然,天真的方法不会这样做。我们可以做些什么呢?
答案 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