python 静态变量的问题

2015-08-30 19:58:18 +08:00
 pc10201
# coding=utf-8

class Linux (object ):
    name = 'linux'
    hardware = {'cpu': 'intel', 'disk': '500G'}


l1 = Linux ()
l1.name = 'CentOS'
l1.hardware['cpu'] = 'amd'

l2 = Linux ()

print l2.name, l2.hardware

输出结果

linux {'disk': '500G', 'cpu': 'amd'}

name 和 hardware 都属于静态变量,为什么修改了 name 不影响另一个实例,而修改了 hardware 就会呢?

2564 次点击
所在节点    Python
4 条回复
KIDJourney
2015-08-30 20:11:57 +08:00
因为 hardware 是一个引用,他指向了一个字典。
你在修改的过程中并没有修改引用本身,而是修改了指向的字典的值。

你如果把

l1.hardware['cpu'] = 'amd'

改为

l1.hardware = {'cpu':'amd','disk':'500G'}

就不会出现这种状况。
leavic
2015-08-30 20:22:55 +08:00
所以 python 会建议你把类成员数值的初始化放到_init_函数里去,这样可以避免这个问题。
ljcarsenal
2015-08-30 20:39:33 +08:00
可变类型和不可变类型的区别,以及类变量和实例变量的区别
wingor2015
2015-09-04 16:32:31 +08:00
@ljcarsenal 嗯, c 系列语言过来的人容易被坑

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/217154

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX