는 예로서 이것을 가지고 이상한 행동 특성 :파이썬 2.7 클래스는
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 개 변수를 초기화 그리고 난 그들 모두가 내가 liz1
으로 업데이트 한 같은 dict_class_var
및 string_class_var
를 가리키는 지 기대하고 있습니다 그러나 이것은 출력 :
dict: {'last': 'do', 'first': 'david'}
str: lion
dict: {'last': 'do', 'first': 'david'}
str: monkey
dict: {'last': 'do', 'first': 'david'}
str: monkey
DICT가 된 이유 그들 모두를 위해 업데이트되었지만 문자열은 그렇지 못했습니까?
사전은 * 변경할 수 있기 때문에 *. 'liz1.string_class_var = "lion"'은 새로운 문자열 객체를 인스턴스 속성에 할당합니다. –
@Martijn : 그건 사실 복제품이 아닙니다. 그것은 왜 클래스 변수가 공유되는지를 묻는 것입니다. OP는 그것을 알고있는 것처럼 보이고 그것을 원한다. 이것은 왜 데이터가 공유되지 않는지에 대한 것입니다. – BrenBarn
@BrenBarn : 예, 그렇습니다. 인스턴스에 지정하면 공유하지 않는다는 의미입니다. –