面向对象的实例变量问题

时间:2017-01-18 02:06:23

标签: python class oop object instance

我有以下代码:

class Stock(object):
     def __init__(self,name,price):
         self.name = name
         self.price = price

     def Add_Price(self,data):
          self.price.append(data)

def test():
     l=[]
     n=0
     while n < 390:
         s1= Stock('A', l)
         s2= Stock('B', l)

         s1.Add_Price(d1[n])  # d1 is a list with the prices for A #
         s2.Add_Price(d2[n])  # d2 is a list with the prices for B #

         print s1.price, s2.price

         n=n+1

当我运行它时,我会假设调用s1.price您将收到一个价格为A的数组,而s2.price将有库存价格{{1} }。但是,当我运行它时,Bs1.price是相同的。

因此,当我向s2.price附加一个新值时,它似乎没有将它附加到该类的当前实例的变量。

任何人都可以指出我做错了吗?

修改

当前输出:

self.price

期望的输出:

[10 150] [10 150]
[10 150 10.2 150.3] [10 150 10.2 150.3]

1 个答案:

答案 0 :(得分:1)

您将同一列表的引用传递给两个实例。列表是一个可变对象,因此它是传递引用。

一种解决方案是创建两个列表:

def test():
    l_1 = []
    l_2 = []
    s1= Stock('A', l_1)
    s2= Stock('B', l_2)
    n=0   

    while n < 390:
        s1.Add_Price(d1[n])  # d1 is a list with the prices for A # 
        s2.Add_Price(d2[n])  # d2 is a list with the prices for B #

但是,由于它共享相同的引用,因此您还将在该类外部附加l_1和l_2。 由于d1和d2是价格列表,另一种解决方案是在实例化时创建一个列表,如果Add_Price()传递一个列表,则扩展Stock列表,如果它不是列表则附加价格。

股票类构造函数:

class Stock(object):

    def __init__(self,name,prices=None):
        self.name = name
        self.price = prices or [] #create a new list on instantiation

    def Add_Price(self,data):
        if isinstance(data, list):
            self.prices.extend(data)
        else:
            self.prices.append(data)

然后在你的test()函数中:

def test():
    s1 = Stock('A')
    s2 = Stock('B')

    s1.Add_Price(d1[:390])
    s2.Add_Price(d2[:390])

d1[:390]是拼接,它表示从索引0(包括)到索引390(不包括)的所有元素,这允许您不再需要while循环。