【问题标题】:Why it require [:] (colon) in the function to mutate a list in global scope?为什么它需要在函数中使用 [:](冒号)来改变全局范围内的列表?
【发布时间】:2020-10-24 21:09:20
【问题描述】:

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

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]

我的问题是为什么我们需要 [:] ?我认为它反过来,如果我们不想改变原始列表,我们在它后面加上 [:] 来复制它。但这似乎是相反的。它可能与全局和函数范围有关。我尝试使用pythontutor但仍然感到困惑。

谢谢!

编辑:分号 -> 冒号

【问题讨论】:

  • 那不是分号。
  • 您是否忘记从函数中返回它?请注意,在第一种情况下,您只是将变量 x 重新分配给其他东西(x * 2 创建一个新列表)。

标签: python python-3.x list function copy


【解决方案1】:

正如其他答案所说:这种行为是由函数范围和全局范围引起的。为了清楚起见,让我们将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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 谢谢。我还是一头雾水,为什么要在 x 上加上 [:] 才能变异?
    • 这是因为如果你不这样做,只有对象的值会被改变,并且它只会在该函数范围内可见,不会反映在实际对象中。但是当 [:] this 被放置时,它创建和对象并且它被改变。尝试对可变和不可变对象进行切片,它会变得清晰
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    • 2013-07-13
    • 2015-03-22
    • 2011-06-11
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    相关资源
    最近更新 更多