如何用参数构造函数?

2024-10-02 14:22:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我开始做一个相当简单的棒球项目,遇到了一个关于函数的问题。我以前用过带变量的函数,所以我不知道为什么这不起作用。你知道吗

home = 0
def basestate(base):
    if base is 0:
        base = 1
        print(base)
    else:
        base = 0
basestate(home)
print(home)

基地将打印为一个,但家不会。理想情况下,我想在1和0之间做一个简单的状态切换。这似乎是最简单的方法,但我不是专家。你知道吗

谢谢你的帮助

扎克


Tags: 项目函数homebaseifis状态def
3条回答

查看代码时会出现两种不同的情况:

可变与不可变数据类型

Python's reference所述:

The value of some objects can change. Objects whose value can change are said to be mutable; objects whose value is unchangeable once they are created are called immutable. (The value of an immutable container object that contains a reference to a mutable object can change when the latter’s value is changed; however the container is still considered immutable, because the collection of objects it contains cannot be changed. So, immutability is not strictly the same as having an unchangeable value, it is more subtle.) An object’s mutability is determined by its type; for instance, numbers, strings and tuples are immutable, while dictionaries and lists are mutable.

所以,在home = 0的情况下,0是一个数字,所以它是不可变的。你知道吗

通过分配

在Python中,几乎所有的东西都是一个对象。在Python中我们通常称之为“变量”的东西更恰当地称为名称。同样,“赋值”实际上是将名称绑定到对象。每个绑定都有一个定义其可见性的范围,通常是名称来源的块。jeffknupp在this blog post中用更多的例子更深入地讨论了这个问题。你知道吗

代码中发生了什么…

所以,当你有home = 0时,现在我们知道名称home指向不可变的数字0。调用basestate(home)时,本地名base被分配给b指向的对象0。此时,id(home) == id(b)(在CPython中,id(object)是内存中对象的地址)。但是,当您说base = 1(或base = 0)时,由于数字(int在本例中)是不可变的,因此名称base被分配一个新的数字对象1。旧的0对象仍然由home引用,但不是由base引用。所以,现在id(home) != id(base),因为它们不再指向内存中的同一个位置。你知道吗

因此,您正在将1(或0)赋值给base,一旦函数退出,base就不再在作用域中了,而且它没有像home那样改变任何东西,因为数字是不可变的。你知道吗

那我该怎么办?

您需要返回所需的值并将其重新分配给home

home = 0

def basestate(base):
    return 1 if base == 0 else 0

basestate(home)
print(home)

别用is来做那种比较。通常,比较值时使用==,比较标识时使用is。在本例中,您正在比较值。但是如果我说id(home) == id(base),我可以说home is base

p.p.S在小数字上使用id()实际上是非常巧妙的,因为当前的CPython实现为-5到256之间的所有整数保留了一个整数对象数组,当您在该范围内创建一个int时,实际上只会得到对现有对象的引用。你知道吗

我希望这对你有帮助!你知道吗

解决这个问题的最简单方法是从basestate返回一个值,并将返回的值赋给home。你知道吗

home = 0
def basestate(base):
    if base == 0:
        return 1
    else:
        return 0

home = basestate(home)
print(home)

更新

多亏了s16h,对basestate的定义更为python:

def basestate(base):
    return 1 if base == 0 else 0

I would ideally like to make a simple state switch between one and zero

对二进制状态开关使用True/False如何?你知道吗

home = False

home = not home
print(home) # True

home = not home
print(home) # False again

相关问题 更多 >