我试图理解Python对变量作用域的方法。在这个例子中,为什么f()能够改变x的值,就像main()所感知的那样,但不能改变n的值?
def f(n, x):
n = 2
x.append(4)
print('In f():', n, x)
def main():
n = 1
x = [0,1,2,3]
print('Before:', n, x)
f(n, x)
print('After: ', n, x)
main()
输出:
Before: 1 [0, 1, 2, 3]
In f(): 2 [0, 1, 2, 3, 4]
After: 1 [0, 1, 2, 3, 4]
请参见:如何通过引用传递变量?
如果你正确地思考,Python是一种纯粹的值传递语言。python变量在内存中存储对象的位置。Python变量不存储对象本身。当您将变量传递给函数时,您正在传递变量所指向的对象的地址的副本。
对比这两个函数
def foo(x):
x[0] = 5
def goo(x):
x = []
现在,当你输入外壳的时候
>>> cow = [3,4,5]
>>> foo(cow)
>>> cow
[5,4,5]
将其与goo进行比较。
>>> cow = [3,4,5]
>>> goo(cow)
>>> goo
[3,4,5]
在第一种情况下,我们将cow地址的副本传递给foo, foo修改了驻留在那里的对象的状态。对象被修改。
在第二种情况下,您将cow地址的副本传递给goo。然后goo继续更改该副本。效果:没有。
我称之为粉红房子原则。如果你把你的地址复印一份,并告诉a
如果油漆工把那个地址的房子漆成粉红色,你就会得到一座粉红色的房子。
如果你给油漆工一份你的地址复印件,让他把它改成一个新地址,
你家的地址不变。
这种解释消除了许多困惑。Python将地址变量按值存储。