Python 作用域可变与不可变

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

关于Python 作用域可变与不可变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8407035/

相关文章:

reference - 为什么我不能从闭包中返回对外部变量的可变引用?

python - 如何使用 python 控制台修复 import keras 错误

python - 在keras中将输入与常量向量连接起来

python - python 中的列表是不可变的吗?它们是在函数中传递值吗?

python - 列表列表更改意外地反射(reflect)在子列表中

variables - 将 "mut"放在变量名之前和 ":"之后有什么区别?

python - Pandas:通过具有相同值分组的另一列对频率列进行排序

python - 如何访问 numpy ndarray 的元素?

java - 为什么 String 在 Java 中是不可变的或最终的

java - 可变日期类修复