【发布时间】:2019-04-04 13:01:26
【问题描述】:
b = [0]
def copyalist(b):
b = [1, 2, 3]
print(b)
copyalist(b)
print(b)
输出如下:
[1, 2, 3]
[0]
第一行表示在函数中,b被设置为[1,2,3]; 但是,当您从函数中 print(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]
【问题讨论】:
-
因为在您的第一个示例中,您的函数不返回任何内容,只是打印您在其中定义的列表,一旦调用返回,它会打印具有
[0]的原始b列表.没有什么神奇的。也没有任何内容被复制。 -
在您的第二个 sn-p 中,您只是将列表与前一个列表连接/合并。没有任何内容被复制。
-
您有两个完全不相关的变量,名为
b:一个全局变量,一个位于copyalist()内部的局部变量。本地b的初始值与全局b相同,但是一旦您为本地b分配新值,就会发生变化。 -
确保您了解全局变量和局部变量之间的区别。此外,在函数范围内更改全局变量也不是一个好习惯。