4 回答
TA贡献1824条经验 获得超8个赞
bar = []
重新绑定 bar
; 它创建一个全新的empty list
,并将其绑定到该名称bar
。没关系bar
,以前没关系。它可能是一个int
,一个tuple
,或者dict
,它现在是无关紧要的,因为它现在已经绑定到一个全新的list
。旧的绑定不再存在于当前方法调用中,但原来的绑定list
仍然作为default参数的值存在foo
(请注意:由于这种混乱,可变默认值被认为是令人惊讶且丑陋的)。
bar.clear()
呼吁的方法存在的 list
,它告诉list
清除本身(对什么没有影响bar
是指,它最好是一些有clear
方法,但除此之外,它不是真正需要的,这是一个list
)。因为它是在同 bar
您开始使用(引用的函数默认缓存相同可变默认值),会影响你未来的电话(因为bar
继续指list
你为可变默认提供)。
TA贡献1835条经验 获得超7个赞
这里的代码bar
是对内存中某些列表的引用。使用时bar = []
,变量bar
将与新的(空)列表关联。使用时 bar.clear()
,您将修改当前列表。
一般来说,这意味着Python中的列表是通过引用而不是通过值传递的。您可以在此处了解更多信息。
TA贡献1863条经验 获得超2个赞
当执行a时list.clear()
,列表将被清除:-)当执行a时list = []
,列表将被新的空列表覆盖。
所不同的是,如果某项内容在被覆盖之前已经在引用列表,那么它仍将引用您认为现在已经清除的值。
这是引入极难调试的错误的绝妙方法。
TA贡献1794条经验 获得超8个赞
假设您有一个包含一些值的列表,并将其分配给名为foo的变量。
foo = [0, 1]
现在,此变量指向内存中的此列表。
假设您然后创建一个名为bar的新变量并分配给foo。
bar = foo
现在,这两个变量指向内存中的同一列表对象。如果然后更改foo并使它等于[],bar会发生什么?
foo = []
bar == [0, 1] # True
现在,让我们对foo.clear()进行相同的操作。
foo.clear()
bar == [] # True
这是因为在列表上使用clear方法会清除该列表对象,这会影响引用该对象的所有内容,而将变量分配给空列表只会更改该变量的内容,而不会更改任何原始列表。
添加回答
举报