理解Python中的可变性

2024-06-09 17:04:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个片段:

a = [1,2,3]
b = a
b = [4,5,6] # a doesnt change

还有这个:

a = [1,2,3]
b = a
b[0] = 5 # a also changes

b的初始化是如何决定a的可变性的?你知道吗


Tags: changealsochangesdoesnt
1条回答
网友
1楼 · 发布于 2024-06-09 17:04:58

当您创建一个列表并将其分配给一个变量时,如

a = [1, 2, 3]

创建一个对象,变量a保存对该对象的引用。当你这么做的时候

b = a

您在b中指定了相同的引用,因此现在a和b都指向您的列表。所以当你执行

b[0] = 5

你改变了同样的清单。你知道吗

通过使用id()函数可以看到这一点,该函数返回对象的内存地址:

>>> a = [1, 2, 3]
>>> b = a
>>> id(a), id(b)
(140454191340720, 140454191340720)

它们是相同的。关键是,a和b本身不是列表,它们指向一个列表。你知道吗

当你这样做的时候:

a = [1, 2, 3]
b = a
b = [2, 3, 4]

您首先将a指向的列表的引用指定给b,然后再为其指定一个新的引用。你知道吗

顺便说一句,这可能会咬你的背后,当你做一些事情的路线

def foo (a=[]):
    a.append(42)
    return a

由于参数a在每次调用时都指向同一个列表,因此如果在没有参数的情况下调用此函数5次,则列表将包含5x 42:

foo(); foo(); foo(); foo();
print(foo())
>>> [42, 42, 42, 42]

相关问题 更多 >