为什么它需要函数中的[:](冒号)来在全局范围内改变列表?

2024-05-14 15:26:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过将列表作为参数传递给函数来找到一种改变列表的解决方案。例如:

def f(x):
    x = x*2
x = [9,8,7]
f(x)
print(x)

我希望结果是:

[9, 8, 7, 9, 8, 7]

但结果是这样的:

[9, 8, 7]

然后我偶然发现了这条线索:https://stackoverflow.com/a/31359713/13275449

这个解决方案非常有效

def f(x):
    x[:] = x*2
x = [9,8,7]
f(x)
print(x)

[9, 8, 7, 9, 8, 7]

我的问题是为什么我们需要[:]?我认为这是另一种方式,如果我们不想改变原始列表,我们在它后面放[:]来复制它。但这一次似乎正好相反。它可能与全局和功能范围有关。我试着用Python,但仍然感到困惑

谢谢大家!

编辑:分号->;结肠


Tags: 函数httpsgt功能com编辑列表def
2条回答

这是浅拷贝和深拷贝的概念,传递一个列表[:],这样会创建列表的shallow copy,并将原始列表的所有引用分配给创建的新副本。参考文档了解更多详细信息,我已添加了链接。 让我知道这是否有助于兄弟

正如其他答案所说:这种行为是由函数范围和全局范围引起的。为了清楚起见,让我们在函数内调用local x到x,然后调用global x到另一个。您将global x值作为参数传递给f函数,然后使用其值创建一个新变量local x,第二个变量与第一个变量无关,因为它只存在于函数内部,您将无法在函数外部调用它,如果将local x重命名为y,您将不会遇到这种混乱:

def f(x):
    y = x*2
    print(f'Inside function: {y}')
x = [9,8,7]
f(x)
print(f'Global x: {x}')

输出:

Inside function: [9, 8, 7, 9, 8, 7]
Global x: [9, 8, 7]

另一方面,使用x[:]您实际上指向global x,这就是您可以使用y而不是local x打印其值的原因,您将得到如下错误:

Traceback (most recent call last):
File [file_name], line 6, in <module>
print(f'Global x: {y}')
NameError: name 'y' is not defined

相关问题 更多 >

    热门问题