首先,我要像其他人一样开始。我是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]
我理解,因为整数是不可变的,所以保持在10,但我不明白为什么b改变而c不改变。
答案 0 :(得分: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
做任何事情,请记住,这在功能上与原始元素相同。< / p>
答案 1 :(得分: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”实现不同。
答案 2 :(得分:0)
a
不保留值10,因为它是不可变的。它保留值10,因为当您在a = 1
的本地范围内调用f()
时,您将创建一个新变量。
当您在c = b
内拨打f()
时,本地c
将成为b
所代表的可变对象的本地引用。当您在该可变对象中重新分配值时,更改将反映在原始对象中。