Python:为什么类方法中的此本地列表变量保留其值?

JDM

我四处搜寻并找到了这篇文章,它为我提供了为什么发生这种情况的线索-看来我只是遇到了一个更复杂,更微妙的案例。但是那些微妙之处使我感到困惑,并寻求更清晰的解释。(我怀疑这是否重要,但以防万一:我在Windows 7上使用Python2.7.x。)

起点是这段代码,我从一个更大,更复杂的应用程序中提炼出了我最初遇到的问题。

class MyClass():
    def printStuff(self,myList=[1,2,3],myInt=4):
        print '--------------------------------'
        print 'myList at start: '+str(myList)
        print 'myInt  at start: '+str(myInt)
        doNotCare = myList.pop()
        myInt = myInt - 1
        print 'myList at end:   '+str(myList)
        print 'myInt  at end:   '+str(myInt)

testMC = MyClass()
testMC.printStuff()
testMC.printStuff()
testMC.printStuff()

...将产生以下输出:

--------------------------------
myList at start: [1, 2, 3]
myInt  at start: 4
myList at end:   [1, 2]
myInt  at end:   3
--------------------------------
myList at start: [1, 2]
myInt  at start: 4
myList at end:   [1]
myInt  at end:   3
--------------------------------
myList at start: [1]
myInt  at start: 4
myList at end:   []
myInt  at end:   3

现在,基于有关如何在函数中处理默认参数的各种文章,似乎myInt应该表现出与相同的行为myList,即应将其递减为3、2、1。但是显然不是。

如果我修改该doNotCare = myList.pop()行,而不是使用切片来更新列表,则难题会变得更加复杂

class MyClass():
    def printStuff(self,myList=[1,2,3],myInt=4):
        print '--------------------------------'
        print 'myList at start: '+str(myList)
        print 'myInt  at start: '+str(myInt)
        myList = myList[:-1]
        myInt = myInt - 1
        print 'myList at end:   '+str(myList)
        print 'myInt  at end:   '+str(myInt)

testMC = MyClass()
testMC.printStuff()
testMC.printStuff()
testMC.printStuff()

...以某种方式击败了那个意外的保留值,产生了输出:

--------------------------------
myList at start: [1, 2, 3]
myInt  at start: 4
myList at end:   [1, 2]
myInt  at end:   3
--------------------------------
myList at start: [1, 2, 3]
myInt  at start: 4
myList at end:   [1, 2]
myInt  at end:   3
--------------------------------
myList at start: [1, 2, 3]
myInt  at start: 4
myList at end:   [1, 2]
myInt  at end:   3

因此,我想第一个问题是,实际上这只是参考文献中描述的默认参数行为的更复杂,更微妙的情况吗?如果是这样,那么当我用切片而不是切片操作时,该行为为何不适用于myInt-甚至什至不适用myListpop

致癌物质

与列表不同,数字是不可变的,因此不能更改。可以重新分配对它们的引用,但是1始终是1。

拼接不会产生此行为,因为它会创建原始副本,而pop修改原始列表。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么结构中的变量不保留其值?

为什么我的类变量在方法之间改变其值?

为什么C#链表类变量被赋值后不保留其值?

为什么在运行时重新定义的此方法不保留其值?

为什么类方法中的此实例变量赋值不会导致 Python 中的 UnboundLocalError

为什么列表数组在onCreate方法中失去其值?

为什么ArrayList中的对象数组无法保留其值?

为什么列表不保留其价值?

为什么 append 方法会修改 python 类中的变量?

为什么静态成员变量对递归方法中的保留值不起作用?

为什么构造函数与方法不同,为什么不保留Java中其参数的名称?

为什么我的本地存储在刷新后没有保留变量的值?

为什么在JS类方法中定义和调用的函数中未定义此变量。我认为这是窗口

为什么我的 DOM 变量保留值?

为什么静态方法中的本地类不是静态的

为什么在Python中未定义此变量?

为什么此对象中的变量没有被其回调函数修改?

为什么此变量的值会更改?

为什么此函数在 Python 中不返回列表?

为什么此参数列表在Python中不会更改?

为什么我不能使用方法更改类中列表的值?

为什么子类不覆盖其超类变量的值?

为什么匿名类不能访问其封闭类的变量?

为什么我们不能使用超类的引用变量来访问其子类的方法(超类中没有的方法)?

为什么我的@State对象不保留其值?

Swift,为什么不发布此本地变量?

变量不保留其值

为什么我无法在Python中通过以下方法之一访问类变量?

为什么分配此Cookie时不会更改其值?