我是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]
答案 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