Are Class variables mutable?
如果我定义一个简单的类
1 2 3 4 5
| class someClass():
var = 1
x = someClass()
someClass.var = 2 |
这将使x.var等于2。这是令人困惑的,因为通常类似这样的事情:
将保持B完好无损作为b==1。那么,为什么类变量的情况不一样呢?区别在哪里?可以调用所有类变量可变吗?在某种程度上,类变量的工作更像是为a=[1]分配一个列表,并执行a[0]=2。
基本上,问题在于x.var如何访问someclass.var。当两个变量在python中设置为相等时,它必须是不同的。发生什么事了?
- 现在设置x.var = 3,看看someClass.var会发生什么。
- 我知道,但这不是重点
- 不,这就是重点。本质上,当你做someClass.var和someInstance.var时,并不一定是相同的事情。
- 这完全不是因为someclass.var=2改变了x.var,以及x.var与python中变量的正常功能相比是如何绑定到类变量的。
- 那么为什么someclass.var=2会改变x.var呢?
- someClass.var不改变x.var。有时,实例属性会隐藏类属性。这就是你看到的行为。
- 如果x没有自己的var属性,则使用类。当它这样做的时候,两个就分离了。
- 试试看,Python2.7
- 我以前试过。很多次。顺便说一句,实际上,易变性根本不是问题所在。但好吧,试试这个。x = SomeClass(); x.var = 'foo'; SomeClass.var = 'bar'。someClass.var改变了x.var吗?
- 试试someclass.var = 1,那么x.var是1,那么x.var = 2,someClass.var不是2,那么someclass.var = 3和x.var仍然是2。
- 所以,问题不是易变性。问题是名称空间。通常,我们认为名称空间是不同的,但在OOP中,实例可以访问其类名称空间。
- 一张图片胜过千言万语:stackoverflow.com/a/34126204/476
- @c.fe我知道这一点,但是行为仍然是这样工作的,相反的,如果x.var是由x.var=someclass.var定义的,那么会发生完全不同的情况。我没有在"python中的静态类变量"线程中看到这一点。
- @Pindakaas你到底是什么意思?xvar = someClass.var,然后是x.var = 'something else',现在someClass.var变了吗?
- @平达卡斯,我要把这作为一个答案,在这成为一个复制品的目标之前。如果它有助于解决问题,请告诉我。
- @死亡,这是我认为最好的欺骗目标
- @我想是的。
- 我认为在第二个副本"python:类和实例属性之间的区别"中,quesion实际上不是匹配的,但答案肯定是。谢谢你的链接
var是someClass的静态类变量。
当您伸出手去获取x.var、y.var或some_other_instance.var时,您访问的是同一个变量,而不是实例派生的变量(只要您没有将它作为属性专门分配给实例)。
- 那么,当我使用x.var=2时,我基本上在x中创建了一个新的变量,在这个例子中,它隐藏了someclass中的变量?
- @宾达克斯宾果!