我是python的新手,无法解决这里出现的问题。
将此函数放入python shell:
def add1(x):
x += 1
当我设置p = 0并调用
时add1(p)
我仍然得到p = 0。是什么给了什么?
最终我正试图制作一个“交易”功能,可以在手上添加两张随机牌。我会用交易(player1_hand)来调用它吗?
答案 0 :(得分:3)
您在这里缺少的是理解变量的范围。在Python中(与大多数编程语言一样),输入函数意味着您正在进入一个新的范围,其中只有函数的参数和任何全局变量都可用。
离开函数时,此范围(以及对该范围中的变量所做的任何更改)都会消失。这就是你得到这个的原因:
def add1(x):
x += 1
p = 0
add1(p)
print(p)
仍会显示0
。
这里最好也是最干净的选择是让你的函数返回新值。这样,该函数就是所谓的“纯”函数,因为它只对其参数进行操作,并产生一个新值,而不依赖或影响全局范围:
def add1(x):
return x + 1
p = 0
p = add1(p)
print(p)
有关详情,请阅读https://python-textbok.readthedocs.io/en/1.0/Variables_and_Scope.html#variable-scope-and-lifetime
希望这有帮助!
答案 1 :(得分:1)
def add1(x):
return x+=1
p = add1(p)
在函数内部变异p
而不返回将要求您p
全局。
但还有更多内容,请看一下这个问题How do I pass a variable by reference?
答案 2 :(得分:1)
这里的所有答案都有return语句,这可能是最简单的解决方案。 您可能想要的是通过引用传递,这可能在C#C ++等语言中有效,但在这里不能用于可重整的整数
您可以通过将整数值放在自己的类中来实现它,因为类的实例是通过引用传递的,然后您可以在不使用return语句的情况下更改整数值。
示例:
class IntHolder:
def __init__(self):
self.value = 0
def add1(x):
x.value += 1
myInt = IntHolder()
add1(myInt)
print(myInt.value)
输出:
1
您也可以编写自己的类,为您提供可变整数。
答案 3 :(得分:0)
您必须返回更新的值:
def add1(x):
x += 1
return x
p = 0
print (add1(p))
答案 4 :(得分:0)
在上面的程序中,您将变量p的引用复制到局部变量x。因此,您必须再次将x的值返回到p。
def add1(x):
return x+=1
p = add1(p)