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 的值,因此不会改变 x
在 test
.
之外声明
在情况 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
,这会改变外部列表。
所以我试图让可变性更好地进入我的大脑,我看到很多有经验的人有时会遇到困难。
我在这里做了这个小测试代码:
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 的值,因此不会改变 x
在 test
.
在情况 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
,这会改变外部列表。