Python:为什么对象没有被函数修改?

时间:2017-10-09 11:10:44

标签: python

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

我是否遗漏了全局变量与局部变量的内容?

当我们拨打f时,是否有对象的副本?

我的问题类似于this question。然而,结论对我来说并不清楚,并没有帮助我理解我错在哪里。

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]

3 个答案:

答案 0 :(得分:1)

当你这样做时:

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

现在,要使用x之外的f,只需摆脱作业操作:

>>> 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值也发生了变化。

答案 1 :(得分:0)

如果你想改变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传递给该函数并进行编辑。

答案 2 :(得分:0)

您正在重新声明函数中的x。函数内部的x与函数外部的x不同。此外,您无法从函数内部调用x。因此,为了使您的代码有效,您需要从函数内部删除x。有关更多信息,请参阅Python variable scope