list.clear()与list = []有何不同?

该功能的预期目标foo是将作为参数提供的数字添加到列表中,如果该数字为0,则重置列表。首先我写了这个程序:


def foo(n, bar = []):

    if n == 0:

        bar = []

        print("list empty")

    else:

        bar.append(n)

        for y in bar:

            print(y, end=', ')

        print()


foo(5)

foo(3)

foo(0)

foo(6)

输出:


5, 

5, 3, 

list empty

5, 3, 6, 

但看起来却被bar = []忽略了。然后我改变bar = []了bar.clear(),它按照我的想法工作:


def foo(n, bar = []):

    if n == 0:

        bar.clear()

        print("list empty")

    else:

        bar.append(n)

        for y in bar:

            print(y, end=', ')

        print()


foo(5)

foo(3)

foo(0)

foo(6)

输出:


5, 

5, 3, 

list empty

6,

我不明白,为什么bar.clear()从工作differntlybar = []自clear()应


从集合中删除所有元素。


所以做同样的事情bar = []。


编辑:我不认为我的问题是“最低惊讶”和可变默认参数的重复,我知道


默认值仅计算一次。


(来自官方教程)但是我要问的是,为什么bar = []不编辑(在这种情况下是清除的)列表,而附加和清除的是呢?


青春有我
浏览 351回答 4
4回答

有只小跳蛙

bar = [] 重新绑定 bar; 它创建一个全新的empty list,并将其绑定到该名称bar。没关系bar,以前没关系。它可能是一个int,一个tuple,或者dict,它现在是无关紧要的,因为它现在已经绑定到一个全新的list。旧的绑定不再存在于当前方法调用中,但原来的绑定list 仍然作为default参数的值存在foo(请注意:由于这种混乱,可变默认值被认为是令人惊讶且丑陋的)。bar.clear()呼吁的方法存在的 list,它告诉list清除本身(对什么没有影响bar是指,它最好是一些有clear方法,但除此之外,它不是真正需要的,这是一个list)。因为它是在同 bar您开始使用(引用的函数默认缓存相同可变默认值),会影响你未来的电话(因为bar继续指list你为可变默认提供)。

qq_花开花谢_0

这里的代码bar是对内存中某些列表的引用。使用时bar = [],变量bar将与新的(空)列表关联。使用时 bar.clear(),您将修改当前列表。一般来说,这意味着Python中的列表是通过引用而不是通过值传递的。您可以在此处了解更多信息。

小唯快跑啊

当执行a时list.clear(),列表将被清除:-)当执行a时list = [],列表将被新的空列表覆盖。所不同的是,如果某项内容在被覆盖之前已经在引用列表,那么它仍将引用您认为现在已经清除的值。这是引入极难调试的错误的绝妙方法。

幕布斯7119047

假设您有一个包含一些值的列表,并将其分配给名为foo的变量。foo = [0, 1]现在,此变量指向内存中的此列表。假设您然后创建一个名为bar的新变量并分配给foo。bar = foo现在,这两个变量指向内存中的同一列表对象。如果然后更改foo并使它等于[],bar会发生什么?foo = []bar == [0, 1] # True现在,让我们对foo.clear()进行相同的操作。foo.clear()bar == [] # True这是因为在列表上使用clear方法会清除该列表对象,这会影响引用该对象的所有内容,而将变量分配给空列表只会更改该变量的内容,而不会更改任何原始列表。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python