gpt4 book ai didi

Python 计数器变量在第二次运行时出错?

转载 作者:太空宇宙 更新时间:2023-11-04 06:41:32 25 4
gpt4 key购买 nike

我运行的程序是

class Account(object):
counter = 0

def __init__(self, holder, number, balance, credit_line = 1500):
Account.counter += 1

def __del__(self):
Account.counter -= 1

print "Counter\t", Account.counter
a1 = Account("Homer Simpson", 2893002, 2325.21)
print "Counter\t", Account.counter
a2 = Account("Fred Flintstone", 2894117, 755.32)
print "Counter\t", Account.counter
a3 = a2
print "Counter\t", Account.counter
a4 = Account("Bill Gates", 2895007, 5324.32)
print "Counter\t", Account.counter
del a4
print "Counter\t", Account.counter

我第一次运行它时输出是正确的:

Counter 0
Counter 1
Counter 2
Counter 2
Counter 3
Counter 2

但是如果我在同一个控制台中再次运行它:

Counter 0
Counter 0
Counter 1
Counter 0
Counter 1
Counter 0

知道为什么第二次输出会改变吗?

最佳答案

啊,现在知道了!..大问题!..

在第二次运行中:

print "Counter\t", Account.counter   #Class instantiated. Prints 0 
a1 = Account("Homer Simpson", 2893002, 2325.21) #a1 is dereferenced and referenced again!..

上面发生的事情是创建了一个新的 Account 对象。从而增加了计数器。然而,当 a1 再次引用它之前引用的同一个对象时,它丢失了!..因此调用 del 并收集垃圾并将计数减 1。

print "Counter\t", Account.counter #Thus no change as referencing dereferencing happen together.Prints 0.
a2 = Account("Fred Flintstone", 2894117, 755.32)

现在等一下,接下来它会打印 1。那个怎么样?上面发生了什么?.. 现在记住 a2 和 a3 都引用同一个对象。当 a2 引用新对象时,旧对象不会被垃圾回收,因为 a3 仍在引用它,因此增量。

print "Counter\t", Account.counter #Gets incremented and prints 1 as explained above.
a3 = a2

现在您可能明白了 ;-).. 没有创建新对象,但是之前引用的对象的最后一个引用丢失了,因为 a3 引用了一个新对象,从而减少了计数。

print "Counter\t", Account.counter #Count decremented print 0 as explained above.
a4 = Account("Bill Gates", 2895007, 5324.32)

这里有点棘手,但等等。请记住,您在上次运行时已经删除了 a4。因此创建了一个全新的对象,增加了计数。

print "Counter\t", Account.counter #count incremented prints 1
del a4

现在你一定明白了。好问题!...:-D

print "Counter\t", Account.counter

很抱歉糟糕的编辑。在这里相当新,手头没有太多时间但无法克制回答:-P

关于Python 计数器变量在第二次运行时出错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42721745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com