6

首先,我要像其他人一样开始。我是 python 新手。我的老师给了我一个问题:

def f(a, b, c):  
    a    = 1 
    c    = b 
    c[0] = 2 
a = 10 
b = [11, 12, 13] 
c = [13, 14, 15] 
f(a, b, c) 
print a, b, c

它打印:

10 [2, 12, 13] [13, 14, 15]

我知道 a 保持在 10 因为整数是不可变的,但我不明白为什么 b 会改变而 c 不会。

4

3 回答 3

4
c    = b 
c[0] = 2

由于您设置c指向b,您可以轻松地执行以下操作:

def f(a, b, unused): # notice c isn't in the parameter list  
    a = 1
    c = b # c is declared here
    c[0] = 2 # c points to b, so c[0] is b[0]

现在很明显,c它总是与 相同b,所以为什么不直接删除它:

def f(a, b, unused):
    a = 1
    b[0] = 2

现在很明显,您正在更改 的第一个元素,b而不是对 进行任何操作c,请记住,这在功能上与原始元素相同。

于 2011-12-06T21:28:09.337 回答
2

关键是将变量理解为引擎盖下的指针:

def f(a, b, c):  
    a    = 1 # a is a single scalar value, so no pointing involved
    c    = b # point the local "c" pointer to point to "b"
    c[0] = 2 # change the 2nd value in the list pointed to by "c" to 2

当你调用 f(a,b,c) 时,实际上只有 b 被改变了。函数实现内部的“c”变量与函数外部的“c”实现不同。

于 2011-12-06T21:30:54.987 回答
1

a不保留 10 的值,因为它是不可变的。它保留 10 的值,因为当您a = 1在本地范围内调用时f()会创建一个新变量。

当你调用c = binsidef()时,localc成为对由 表示的可变对象的本地引用b。当您重新分配该可变对象中的值时,更改会反映在原始对象中。

于 2011-12-06T21:30:57.947 回答