此程序从文件中读取并为文件的每一行上的数据创建一个Tunnel对象。该计划的具体细节并不重要。输出将清楚地说明我遇到的问题。
每次我将新隧道(名为temp)附加到列表中时,所有旧隧道(也称为在for循环的先前迭代中创建的temp)都将更改为新的隧道临时值。如果这令人困惑,请向下滚动并阅读输出。
class Tunnel: #I am using the data from the file to create tunnel objects
def __init__ (self,x,y,d):
self.x=x
self.y=y
self.d=d
def __lt__ (self,other):
return self.d<other.d
def __repr__ (self):
return "%s %s" % (str(x),str(y))
file = open("ant.in")
n=int(file.readline())
for i in range(0,n): #this loop is irrelevant
h,t=(int(s) for s in file.readline().split())
tList=[]
mst=[]
for j in range(0,t):
x,y,d=(int(s) for s in file.readline().split())
temp = Tunnel(x,y,d) #I create a new tunnel called "temp"
print(temp) #I print it. It prints as its x and y fields.
tList.append(temp) #I try and append this new tunnel to my list
print(tList) #the list prints all the tunnels, but all the tunnels are changed to the most recent one
程序输出
1 2
[1 2]
2 3
[2 3, 2 3]
3 3
[3 3, 3 3, 3 3]
1 4
[1 4, 1 4, 1 4, 1 4]
列表应打印
[1 2, 3 4, 3 3, 1 4]
答案 0 :(得分:4)
这是您的__repr__
- 使用self.x
&amp; self.y
那里:
def __repr__ (self):
return "%s %s" % (self.x, self.y)
因此,您的代码实际上正在工作,但对象的打印不正确。它不是实例属性,而是打印x
&amp;来自全球范围的y
。
答案 1 :(得分:0)
对象是正确的 - 而新对象 - 他们的repr
却是错误的:
在他的__repr__
隧道方法中,你打印的是“x”和“y”变量,而不是
对象的self.x
和self.y
属性。
您的代码现在的方式:
def __repr__ (self):
return "%s %s" % (str(x),str(y))
让Python搜索全局x和y变量 - 这些变量恰好存在,并且对应于用于创建最新对象的值。
另外 - 如果您使用的是Python 2.x,请确保您创建的任何类都继承自object
-
否则你可以发现未来的意外行为。