如何使函数对调用它的对象执行某些操作?

时间:2018-01-16 07:18:41

标签: python

我是python的新手,无法解决这里出现的问题。

将此函数放入python shell:

def add1(x):
    x += 1

当我设置p = 0并调用

add1(p)

我仍然得到p = 0。是什么给了什么?

最终我正试图制作一个“交易”功能,可以在手上添加两张随机牌。我会用交易(player1_hand)来调用它吗?

5 个答案:

答案 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)