我已经开始研究一个相当简单的棒球计划,并且遇到了一个关于功能的问题。我之前使用过带变量的函数,所以我不确定为什么这不起作用。
home = 0
def basestate(base):
if base is 0:
base = 1
print(base)
else:
base = 0
basestate(home)
print(home)
Base将打印为一个,但home不会。理想情况下,我想在一到零之间进行简单的状态切换。这似乎是最简单的方法,但我不是专家。
感谢您的帮助,
扎克
答案 0 :(得分:1)
解决此问题的最简单方法是从basestate
返回一个值,并将返回的值分配给home
。
home = 0
def basestate(base):
if base == 0:
return 1
else:
return 0
home = basestate(home)
print(home)
<强>更新强>
basestate
的更加pythonic的定义,感谢s16h:
def basestate(base):
return 1 if base == 0 else 0
答案 1 :(得分:1)
查看代码时会出现几种不同的事情:
可变数据类型与不可变数据类型
如Python's reference中所述:
某些对象的值可能会发生变化。值可以改变的对象被认为是可变的;一旦创建它们的值不可更改的对象称为不可变。 (包含对可变对象的引用的不可变容器对象的值可以在后者的值更改时更改;但是容器仍然被认为是不可变的,因为它包含的对象集合无法更改。因此,不变性不严格与具有不可改变的值相同,它更加微妙。)对象的可变性由其类型决定;例如,数字,字符串和元组是不可变的,而字典和列表是可变的。
因此,在home = 0
的情况下,0
是一个数字,因此它是不可变的。
通过作业
在Python中,(几乎)一切都是对象。我们在Python中通常称为“变量”的东西更恰当地称为 names 。同样,“赋值”实际上是名称与对象的绑定。每个绑定都有一个范围,用于定义其可见性,通常是名称所在的块。 Jeff Knupp在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}}。旧的1
对象仍然由0
引用,但不是引用home
。所以,现在base
因为它们不再指向内存中的相同位置。
因此,您要将id(home) != id(base)
(或1
)分配给0
,并且一旦该函数退出,base
不再在范围内且它没有改变了base
之类的其他内容,因为数字是不可变的。
那我该怎么办?
您需要返回所需的值并将其重新分配给home
:
home
P.S。请勿使用home = 0
def basestate(base):
return 1 if base == 0 else 0
basestate(home)
print(home)
进行此类比较。通常,在比较值时使用is
,在比较身份时使用==
。在这种情况下,您正在比较值。但在我说is
的情况下,我可以说id(home) == id(base)
PPS 对小数字使用home is base
实际上非常狡猾,因为当你创建一个int时,当前的CPython实现为-5到256之间的所有整数保留一个整数对象数组实际上,您只需返回对现有对象的引用。
我希望这有帮助!
答案 2 :(得分:0)
理想情况下,我希望在一个和零之间进行简单的状态切换
如何对二进制状态切换使用True / False?
home = False
home = not home
print(home) # True
home = not home
print(home) # False again