为什么函数中的列表副本不起作用?

时间:2019-04-04 13:01:26

标签: python list function

b = [0]

def copyalist(b):
    b = [1, 2, 3]
    print(b)

copyalist(b)
print(b)

输出如下:

[1, 2, 3]
[0]

第一行表示在函数中,b设置为[1、2、3]; 但是,当您从函数中打印(b)时,第二个输出显示b仍为[0]。

我不明白,为什么外层b不变?

我还尝试了b = copy.deepcopy([1、2、3]),输出是相同的。

但是,以下代码可以正常工作:

b = [0]

def copyalist(b):
    b += [1, 2, 3]
    print(b)

copyalist(b)
print(b)

输出如下:

[0, 1, 2, 3]
[0, 1, 2, 3]

4 个答案:

答案 0 :(得分:0)

在python中,列表仅通过引用作为函数参数传递,即,仅给出第一个元素的内存地址。在函数内部定义新的b时,只需更改内部变量b所指向的内存位置,但外部b仍指向原始位置。反之亦然,当您执行b += [1, 2, 3]时,您将更改内部b所引用的单元格内的内容,并且由于内部b和外部b指向相同的单元格,因此它反映了更改XMLHttpRequest()的外部。

答案 1 :(得分:0)

b = copyalist(b) 

并在函数中返回b

def copyalist(b):
    b = [1, 2, 3]
    return(b)

在函数中定义某些内容时,只能在该函数内部使用。

答案 2 :(得分:0)

此代码:

def copyalist(b):
    b = [1, 2, 3]
    print(b)

仅意味着将变量名b重映射到新列表,而不修改原始的b。如果要修改原始列表,则必须明确告诉Python替换实际内容。方法是:

def copyalist(b):
    b[:] = [1, 2, 3]
    print(b)

答案 3 :(得分:0)

这是由于全局变量和局部变量不同。您可以将global添加到函数中以获得所需的结果。

b = [0]

def copyalist():
    global b
    b = [1, 2, 3]
    print(b)

copyalist()
print(b)

输出

[1, 2, 3]
[1, 2, 3]

更深入的总结是here