Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python作用域可变与不可变_Python_Immutability_Mutable_Scoping - Fatal编程技术网

Python作用域可变与不可变

Python作用域可变与不可变,python,immutability,mutable,scoping,Python,Immutability,Mutable,Scoping,首先,我要像其他人一样开始。我是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不改变 c = b

首先,我要像其他人一样开始。我是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不改变

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
执行任何操作,请记住,这在功能上与原始元素相同。

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

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”变量不同。

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


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

我还要指出,这与可变/不可变的数据类型无关。正如下面的答案所指出的,这是关于变量赋值的。佩奇讨论了这种差异。我想,让你困惑的只是变量名。给函数外的函数赋予不同的名称,即x、y、z;所以你要调用f(x,y,z),然后打印x,y,z。我相信这不会很难看到。