python函数中把列表(list)当参数时的"入坑"与"出坑"
尝试运行下列函数:方式1def f(x, l=[]): print("------")...
扫描右侧二维码阅读全文
08
2021/12

python函数中把列表(list)当参数时的"入坑"与"出坑"

尝试运行下列函数:

方式1

def f(x, l=[]):
    print("------")
    print(id(l), l)
    for i in range(x):
        l.append(i * i)
    print(l)


f(2)
f(3, [3, 2, 1])
f(3)

输出:

------
3034087835392 []
[0, 1]
------
3034087835456 [3, 2, 1]
[3, 2, 1, 0, 1, 4]
------
3034087835392 [0, 1]
[0, 1, 0, 1, 4]

方式2:

def f(x, l=None):
    if l is None:
        l = []
    print("------")
    print(id(l), l)
    for i in range(x):
        l.append(i * i)
    print(l)


f(2)
f(3, [3, 2, 1])
f(3)

输出:

------
2294922889024 []
[0, 1]
------
2294922889024 [3, 2, 1]
[3, 2, 1, 0, 1, 4]
------
2294922889024 []
[0, 1, 4]

发生了什么?

方式1
第一个函数调用十分明显,for循环先后将0和1添加至了空列表l中。l是变量的名字,指向内存中存储的一个列表。第二个函数调用在一块新的内存中创建了新的列表。l这时指向了新生成的列表。之后再往新列表中添加0、1、2和4。很棒吧。第三个函数调用的结果就有些奇怪了。它使用了之前内存地址中存储的旧列表。这就是为什么它的前两个元素是0和1了。

方式2
方式1,只不过引用的列表都为同一个。

Last modification:December 8th, 2021 at 09:15 am
If you think my article is useful to you, please feel free to appreciate

Leave a Comment