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