Python:为什么函数不修改对象?

Python:为什么函数不修改对象?,python,Python,我是Python新手,我试图理解何时可以修改函数中使用的变量。 在下面的示例中,绑定到x的对象不会被f修改,正如我们在输出中看到的那样。我不明白为什么。 根据我的理解,当我们在f中执行x.append(4)时,我们修改绑定到名称x的对象。但从产出来看,情况似乎并非如此。我的错误在哪里 我是否缺少全局变量和局部变量 调用f时是否有对象的副本 我的问题类似于。然而,这个结论对我来说并不清楚,也无助于我理解我错在哪里 def f(x): x = [0,1,2,3] x.append(4

我是Python新手,我试图理解何时可以修改函数中使用的变量。
在下面的示例中,绑定到
x
的对象不会被
f
修改,正如我们在输出中看到的那样。我不明白为什么。 根据我的理解,当我们在
f
中执行
x.append(4)
时,我们修改绑定到名称
x
的对象。但从产出来看,情况似乎并非如此。我的错误在哪里

我是否缺少全局变量和局部变量

调用
f
时是否有对象的副本

我的问题类似于。然而,这个结论对我来说并不清楚,也无助于我理解我错在哪里

def f(x):
    x = [0,1,2,3]
    x.append(4)
    print('In f():', x)

x = [0,1,2,3]
print('Before:', x)
f(x)
print('After :', x)
输出

Before: [0, 1, 2, 3]
In f(): [0, 1, 2, 3, 4]
After : [0, 1, 2, 3]

当您执行此语句时:

x = [0,1,2,3] 
f
的主体内部,它创建了一个全新的
x
,只用于
f

您可以通过打印变量的
id
来检查这一点:

>>> def f(x):
...    x = [0,1,2,3]
...    x.append(4)
...    print('Inside f, x is: {} with id: {}'.format(x, id(x)))
...
>>> x = [0,1,2,3]
>>> print('{} {}'.format(x, id(x)))
[0, 1, 2, 3] 139706697083592
>>> f(x)
Inside f, x is: [0, 1, 2, 3, 4] with id: 139706697093064
现在,要从
f
外部使用
x
,只需去掉赋值操作:

>>> def f2(x):
...     x.append(4)
...     print('Inside f2, x is: {} with id: {}'.format(x, id(x)))
...
>>> print('{} {}'.format(x, id(x)))
[0, 1, 2, 3] 139706697083592
>>> f2(x)
Inside f2, x is: [0, 1, 2, 3, 4] with id: 139706697083592
>>> x
[0, 1, 2, 3, 4]

您不会发现id是相同的,更重要的是,函数外部的
x的值也已更改。

如果要更改x的值,请尝试以下操作:

def f(x):
    x.append(4)
    print('In f():', x)

x = [0,1,2,3]
print('Before:', x)
f(x)
print('After :', x)

这样,您将把x传递给函数并对其进行编辑。

您正在函数中重新定义x。函数内的x与函数外的x不同。此外,不能从函数内部调用x。因此,为了使代码正常工作,您需要从函数内部删除x。有关更多信息,请参阅

x=[0,1,2,3]
-您也可以在函数内部执行此操作。删除该行,如果不立即使用新对象对其进行阴影处理,您将看到参数值确实被修改。“我们修改绑定到名称
x
”的对象-是的,但您已显式绑定了另一个对象。您不是在全局命名空间中修改
x
,而是在函数命名空间中新创建的对象。它们是不同的对象,即使它们有相同的名称(在不同的名称空间中)。为什么你的函数要用x来重新定义它呢?谢谢jonsharpe和Klaus