繁体   English   中英

可变和不可变对象在函数中表现出不同的行为 python

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM