类型的可变性对变量的范围有影响吗?

问题描述 投票:0回答:1

我正在研究全局变量和局部变量,并注意到列表和整数有一些不同。

当我按预期运行以下代码时,会为整数类型创建两个不同的局部变量和全局变量。

a = 10
def fun(a):
    a = a + 1
    print(a)
    print(id(a))

fun(a)
print(a)
print(id(a))

但是当我对列表执行相同操作时,会发生一些非常奇怪的事情。在下面的代码中,函数内部和外部的变量具有相同的 id。

a = [10, 12]
def fun(a):
    a *= 3
    print(a)
    print(id(a))

fun(a)
print(a)
print(id(a))

这可能有我认为的解释,如果有人知道的话,我当然很想知道原因,但是当我对第 3 行进行非常微小的更改并且我无法指出原因时,情况会变得更疯狂。下面的代码现在将再次具有不同的全局和局部变量。

a = [10, 12]
def fun(a):
    a = a * 3
    print(a)
    print(id(a))

fun(a)
print(a)
print(id(a))

如果有人能够解释为什么列表会改变事物以及为什么不使用简写运算符会改变事物,我们将不胜感激!我正在运行 Python 3.10.6。

python-3.x list scope
1个回答
0
投票

在Python中,整数是不可变的对象,这意味着当您将整数传递给函数时,会创建该整数的新副本。这就是为什么您会在第一个代码片段中看到全局变量和局部变量的不同 ID。

另一方面,列表是 Python 中的可变对象。当您在列表上使用

*=
运算符时,您正在就地修改原始列表。这意味着全局变量和局部变量都指向同一个列表对象,因此它们具有相同的 ID。

当您在列表上使用

*
运算符而不是
*=
时,将创建一个新列表对象并将其分配给局部变量
a
。这就是为什么您在第三个代码片段中看到全局变量和局部变量的 ID 不同的原因。

总而言之,代码中整数和列表之间的行为差异是由于 Python 中列表的可变性造成的。整数对象是不可变的,因此当传递给函数时,它们的行为与列表等可变对象不同。

© www.soinside.com 2019 - 2024. All rights reserved.