Python 中的可变性及其发生的原因?

Mutability in Python and why it happens?

所以我试图让可变性更好地进入我的大脑,我看到很多有经验的人有时会遇到困难。

我在这里做了这个小测试代码:

x = 1
def test():
    x = 2
test()
print(x) #1


x = 1
def test():
    global x
    x = 2
test()
print(x) #2


x = [1]
def test():
    x = [2]
test()
print(x) #[1]


x = [1]
def test():
    global x
    x = [2]
test()
print(x) # [2]


x = [1]
def test():
    x[0] = 2
test()
print(x) #[2]

除了倒数第二个和倒数第二个之间的区别外,一切对我来说都很清楚。这到底是什么规则。我注意到可以更改对象的值但不能更改对象类型本身,还是我理解错了?

# case 1
x = 1
def test():
    x = 2
test()
print(x) #1

# case 2
x = 1
def test():
    global x
    x = 2
test()
print(x) #2

在情况 1 中,test 内的变量 x 是局部范围的,因此更改其值不会更改在 test 外声明的 x 的值,因此不会改变 xtest.

之外声明

在情况 2 中,test 内的变量 x 是全局范围的,因此更改其值确实会更改在 test 外声明的 x 的值,因此会发生变异 x 外面 test.


# case 3
x = [1]
def test():
    global x
    x = [2]
test()
print(x) # [2]

# case 4
x = [1]
def test():
    x[0] = 2
test()
print(x) #[2]

在情况 3 中,test 内的列表 x 是全局范围的,其中包含对 test 外列表的引用,但是当您将新列表分配给 x,一个新的引用被创建到这个列表 [2] 并且改变这个新列表不会改变在 test.

之外声明的列表中的值

在情况 4 中,当您调用 test 方法时,test 方法中的列表 x 引用在函数 test 外部声明的同一列表实例=] 您没有更改对列表的引用,而是将值 2 分配给同一列表内的 index 0,这会改变外部列表。