Python 为什么object中的dictionary和其他dictionary没有区别?
我有以下Python代码:Python 为什么object中的dictionary和其他dictionary没有区别?,python,object,Python,Object,我有以下Python代码: #!/usr/bin/env python2.6 class container(object): name = 'container' configuration = {'var1': 'var1', 'var2': 'var2'} if __name__ == "__main__": container1 = container() container2 = container()
#!/usr/bin/env python2.6
class container(object):
name = 'container'
configuration = {'var1': 'var1',
'var2': 'var2'}
if __name__ == "__main__":
container1 = container()
container2 = container()
container2.name = 'container2'
container2.configuration['var2'] = 'newvar2'
print container1.name
print container1.configuration['var2']
我希望它能打印“container”和“var2”,但对于后者,它会打印“newvar2”
为什么配置变量指向两个对象的同一字典?我怎样才能解决这个问题
大多数答案已经解释了名称和配置是类变量。为什么更改container2.name不会影响container1.name?因为
配置
是类变量而不是实例变量。解决这个问题应该可以解决你的问题
class container(object):
def __init__(self):
self.name = 'container'
self.configuration = {'var1': 'var1',
'var2': 'var2'}
这里的情况是,configuration
最终生活在containter.\uuuu dict\uuuu
中,而不是将其作为类变量时的实例字典中。这意味着c.configuration
只是访问container.\uu dict\uuu['configuration']
对于所有实例c
对于任何类变量,形式为c.foo=x
的赋值为c.\uuuu dict\uuuu
中的foo
创建一个条目,该条目在容器中隐藏。因此,查找将首先返回该值。如果删除它,则查找将返回到检索类实例。你可以
c = container()
c.configuration = x
然后c.配置
将是x
是什么。但插入密钥不是赋值,而是对通过现有绑定访问的现有对象的方法调用
您可以将name
设置为类变量,但如果您希望它从一个实例更改为另一个实例,那么它应该是一个实例变量(当然,除非您需要类范围的默认值)
因此:
实例上的赋值(使用=
,setattr
或直接插入\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。类变量仍然存在
对实例的查找(调用方法,访问值)将获取实例属性(如果存在),否则将获取类变量
因为configuration
是类变量而不是实例变量。解决这个问题应该可以解决你的问题
class container(object):
def __init__(self):
self.name = 'container'
self.configuration = {'var1': 'var1',
'var2': 'var2'}
这里的情况是,configuration
最终生活在containter.\uuuu dict\uuuu
中,而不是将其作为类变量时的实例字典中。这意味着c.configuration
只是访问container.\uu dict\uuu['configuration']
对于所有实例c
对于任何类变量,形式为c.foo=x
的赋值为c.\uuuu dict\uuuu
中的foo
创建一个条目,该条目在容器中隐藏。因此,查找将首先返回该值。如果删除它,则查找将返回到检索类实例。你可以
c = container()
c.configuration = x
然后c.配置
将是x
是什么。但插入密钥不是赋值,而是对通过现有绑定访问的现有对象的方法调用
您可以将name
设置为类变量,但如果您希望它从一个实例更改为另一个实例,那么它应该是一个实例变量(当然,除非您需要类范围的默认值)
因此:
实例上的赋值(使用=
,setattr
或直接插入\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。类变量仍然存在
对实例的查找(调用方法,访问值)将获取实例属性(如果存在),否则将获取类变量
在init()中,如果它们是类变量
在init()中,如果它们是类变量。因为name
和configuration
是容器类的类或静态成员,并且它们对于容器的所有实例都是共享的。对实例变量使用self.name、self.configuration:
class container(object):
def __init__(self):
self.name = "container"
self.configuration = {}
因为name
和configuration
是容器类的类或静态成员,并且它们对于容器的所有实例都是共享的。对实例变量使用self.name、self.configuration:
class container(object):
def __init__(self):
self.name = "container"
self.configuration = {}
为什么name
不是类变量呢?我不希望这个也会改变吗?为什么name
不是一个类变量呢?难道我不希望这个也会改变吗?