2017-10-09 62 views
0

我是Python的新手,我想了解何时可以修改函数中使用的变量。
在下面的示例中,绑定到x的对象不会被f修改,如我们在输出中所看到的。我不明白为什么。 根据我的理解,当我们在f中做x.append(4)时,我们修改绑定到名称x的对象。但看起来情况并非如此,因为产出。我的错误在哪里?:Python:为什么对象没有被函数修改?

我是否缺少全局变量vs局部变量?

当我们拨打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

'x = [0,1,2,3]' - 你这样做**功能**也。删除该行,如果不立即用新对象对其进行遮蔽,则会看到参数值* does *被修改。 *“我们修改绑定到名称'x'的对象”* - 是的,但是您明确绑定了不同的对象。 – jonrsharpe

+1

您并未修改全局名称空间中的'x',而是修改函数名称空间中新创建的''x'。它们是不同的对象,即使它们具有相同的名称(在不同的名称空间中)。 –

+0

https://nedbatchelder.com/text/names.html – chepner

回答

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 

现在,使用从fx,刚刚摆脱赋值操作:

>>> 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以外的函数的值也发生了变化。

+0

谢谢布尔汉 –

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的功能和编辑。

0

您在函数中重新声明x。函数内部的x与函数外部的x不同。此外,你不能从函数内部调用x。所以为了使你的代码正常工作,你需要从你的函数中删除x.For更多信息请参阅Python variable scope

相关问题