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中用更多的例子更深入地讨论了这个问题。你知道吗
查看代码时会出现两种不同的情况:
可变与不可变数据类型
如Python's reference所述:
所以,在
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
:别用
is
来做那种比较。通常,比较值时使用==
,比较标识时使用is
。在本例中,您正在比较值。但是如果我说id(home) == id(base)
,我可以说home is base
p.p.S在小数字上使用
id()
实际上是非常巧妙的,因为当前的CPython实现为-5到256之间的所有整数保留了一个整数对象数组,当您在该范围内创建一个int时,实际上只会得到对现有对象的引用。你知道吗我希望这对你有帮助!你知道吗
解决这个问题的最简单方法是从
basestate
返回一个值,并将返回的值赋给home
。你知道吗更新
多亏了s16h,对
basestate
的定义更为python:对二进制状态开关使用True/False如何?你知道吗
相关问题 更多 >
编程相关推荐