【发布时间】:2015-02-24 15:58:15
【问题描述】:
以此为例:
class Lizard(object):
dict_class_var = {"first": "jon", "last": "do"}
string_class_var = "monkey"
def test():
liz1 = Lizard()
liz1.dict_class_var['first'] = "david"
liz1.string_class_var = "lion"
print "dict: {}".format(liz1.dict_class_var)
print "str: {}".format(liz1.string_class_var)
liz2 = Lizard()
print "dict: {}".format(liz2.dict_class_var)
print "str: {}".format(liz2.string_class_var)
liz3 = Lizard()
print "dict: {}".format(liz3.dict_class_var)
print "str: {}".format(liz3.string_class_var)
Lizard 类有两个类级属性。在test 中,我用Lizard() 初始化3 个变量,我希望它们都指向相同的dict_class_var 和string_class_var,我已经用liz1 更新了它们,但这是输出:
dict: {'last': 'do', 'first': 'david'}
str: lion
dict: {'last': 'do', 'first': 'david'}
str: monkey
dict: {'last': 'do', 'first': 'david'}
str: monkey
为什么所有的字典都更新了,而字符串却没有?
【问题讨论】:
-
因为字典是可变的。
liz1.string_class_var = "lion"将新的字符串对象分配给实例属性。 -
@Martijn:这并不是真正的重复。那就是问为什么类变量是共享的。 OP 似乎知道这一点,并且想要它;这就是为什么数据不共享的原因。
-
@BrenBarn:是的;它告诉您分配给实例意味着您没有共享。
-
@MartijnPieters:也许,但这不是问题的重点。在我看来,这里的问题似乎很清楚,即使类属性已经存在,OP 也没有意识到
instance.obj = blah设置了实例属性。 (这可能也是一个骗局,但我现在找不到。) -
@BrenBarn:在可变类属性的上下文中,有几个答案解决了实例与类属性。这只是常见问题解答的另一种变体。
标签: python string python-2.7 dictionary