[英]Mutable and immutable objects show different behviours in functions wit python
为什么function中数组、列表等可变对象可以直接访问修改,而number等不可变对象只能访问不能修改? 机制是什么。 下面是一些简单的测试代码。
import numpy as np
a = [1,2,3]
b = np.array([1,2,3])
c = 3
def func():
a.append(1)
b[0] = 2
c += 1
print(c)
func()
区别在于你是赋值还是变异。 当您改变数据时,例如a.append(1)
, object 引用 ( a
) 没有改变:它仍然是相同的列表引用。 当你赋值时,变量真的得到了不同的引用,之前引用的 object 不受影响。
没有global
,全局变量可以改变(当它们可变时),但不能分配。
这与是否可变无关,因为如果没有相应的global
语句,即使a = []
也是不允许的。 即使列表是可变的,这个a = []
也不会试图改变任何东西。 它分配。 这需要global
。
好吧,你是在回答你自己的问题。
可变对象在内部是可变的,而不可变对象则不是。
global c
(或内部函数中的nonlocal c
)语句告诉 Python 名称c
指的是全局(或外部)scope 中的名称c
。
由于整数在内部不可变(并且不实现__iadd__
,可以返回+=
的魔术方法), c += 1
执行c = c + 1
,即将表达式c + 1
的值分配给全局名称c
。
如果您在 function 中尝试c += 1
而没有global
语句,您将得到一个UnboundLocalError
,因为在该赋值本身之前没有名称c
可以访问和递增。
这代表任何名字; 试图做
>>> a = []
>>> def f():
... a = a + ["foo"]
...
>>> f()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in f
UnboundLocalError: local variable 'a' referenced before assignment
也失败了,因为在 function 中还没有分配a
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.