Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么object中的dictionary和其他dictionary没有区别?_Python_Object - Fatal编程技术网

Python 为什么object中的dictionary和其他dictionary没有区别?

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()

我有以下Python代码:

#!/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
    不是一个类变量呢?难道我不希望这个也会改变吗?