我试图通过将列表作为参数传递给函数来找到一种改变列表的解决方案。例如:
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,但仍然感到困惑
谢谢大家!
编辑:分号->;结肠
这是浅拷贝和深拷贝的概念,传递一个列表[:],这样会创建列表的shallow copy,并将原始列表的所有引用分配给创建的新副本。参考文档了解更多详细信息,我已添加了链接。 让我知道这是否有助于兄弟
正如其他答案所说:这种行为是由函数范围和全局范围引起的。为了清楚起见,让我们在函数内调用
local x
到x,然后调用global x
到另一个。您将global x
值作为参数传递给f
函数,然后使用其值创建一个新变量local x
,第二个变量与第一个变量无关,因为它只存在于函数内部,您将无法在函数外部调用它,如果将local x
重命名为y
,您将不会遇到这种混乱:输出:
另一方面,使用
x[:]
您实际上指向global x
,这就是您可以使用y
而不是local x
打印其值的原因,您将得到如下错误:相关问题 更多 >
编程相关推荐