python类的实例化问题

classMen:a=[]def__init__(self,b):self.a.append(b)defsayHi(self):print'Hello,mynameis'... class Men:
a=[]
def __init__(self,b):
self.a.append(b)
def sayHi(self):
print'Hello,my name is',self.a
newmen1=Men(1)
newmen1.sayHi()
newmen2=Men(2)
newmen2.sayHi()
newmen1.sayHi()
以上代码的输出为什么是:
Hello,my name is [1]
Hello,my name is [1, 2]
Hello,my name is [1, 2]
newmen2用2进行实例化为什么会影响到newmen1对象的a[]变量?

如果代码改成:
class Men:
a=0
def __init__(self,b):
self.a=b
def sayHi(self):
print'Hello,my name is',self.a
newmen1=Men(1)
newmen1.sayHi()
newmen2=Men(2)
newmen2.sayHi()
newmen1.sayHi()
输出结果又是:
Hello,my name is 1
Hello,my name is 2
Hello,my name is 1
这时候为什么newmen2的实例化不影响newmen1的a变量了呢???这两个例子怎么解释???
展开
 我来答
passepartoute
2011-08-10 · TA获得超过376个赞
知道小有建树答主
回答量:289
采纳率:100%
帮助的人:264万
展开全部
你没有理解类变量和实例变量之间的关系。
第一个例子里面init中append是对类变量的操作。因此实例对象newmen1/2并没有自己的变量a,访问的都是类变量。
这时你如果显示类变量,
print Men.a,newmen1.a,newmen2.a都是一样的。指向同一变量。
第二个例子中的init生成了对象自己的变量a,注意'='! 当实例对象调用init时,每个实例对象都拥有了自己的变量a,你再也无法再通过实例对象来访问到类变量了。事实上这种写法是很不好的。
这时你可以再一次显示类变量,
print Men.a,newmen1.a,newmen2
>> 0 1 2
如果你希望所有对象共用类变量,你可以写
class Men:
a=0
def __init__(self,b):
Men.a=b
def sayHi(self):
print'Hello,my name is',Men.a
这样反而清晰,不要把实例对象公有的变量用self来表示。只会把你自己搞晕。
追问
为什么self.a.append(b)这个不会生成对象自己的变量?而self.a=b却生成了。self 这个关键字不就是指代对象么?所以self.a应该代表了对象里的变量才对啊。麻烦您再讲解一下,谢谢
追答
记住:等号相当于create,而‘.’开头的函数是对已有的对象的修改。如.append,只能增加,所以对象没有这个变量的时候会改到类变量上面去。否则会直接报错。当你使用'='时你就创建了一个对象的变量a. 
我再次强调这是一种很不好的写法,
如果你希望每个对象里有一个独立的list a,你应该在__init__里面写
def __init__(self,b):
self.a = []
self.append(b)
如果你想对类的对象赋值,应该使用
self.__class__.a.append(b)

python没有直接报错只是因为他试图理解你并表现的友好。
>>> class Men:
... a=[]
... def __init__(self,b):
... self.a.append(b) #这是对类变量的操作
... self.a = self.a #这时对象已经拥有了自己的变量a
其俊英x6
2011-08-09 · TA获得超过311个赞
知道小有建树答主
回答量:144
采纳率:0%
帮助的人:97.6万
展开全部
.append的用法你应该知道吧,就是追加。在这里就是在原列表上再加一个元素值(注意是原列表)。而你用等号的时候是从新建立了一个列表。举个例子吧,例如a=[1], b=a, b=[2], 则现在a还是等于1,因为a,b现在采用是不同的引用。如果a=[1], b=a, b.append[2], 则现在a=[1,2],因为a,b现在采用的是同一个引用,即都指向列表[1,2]。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式