我有以下代码:
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} }。但是,当我运行它时,B
和s1.price
是相同的。
因此,当我向s2.price
附加一个新值时,它似乎没有将它附加到该类的当前实例的变量。
任何人都可以指出我做错了吗?
修改:
当前输出:
self.price
期望的输出:
[10 150] [10 150]
[10 150 10.2 150.3] [10 150 10.2 150.3]
答案 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循环。