我对以下两个代码片段的行为差异感到非常困惑,特别是在Python概念中的可变性/不可变性中对它们的行为的期望:
片段1
def some_function(x):
x[0] = 42
input = (3,)
_ = some_function(input)
print(input)
字符串
它产生TypeError: 'tuple' object does not support item assignment
,我的理解是基于元组是不可变的。这是好的。但是...
片段2
def some_function(x):
x = 42
input = (3,)
_ = some_function(input)
print(input)
型
其中... 1] 不抱怨/崩溃关于在尝试改变(一个不可变的!)x
-与前面的代码片段 2] 相比,input
打印为初始的(3,)
,即,好像input
没有以任何方式“暴露”在some_function
的主体的赋值中所采取的操作。
为什么会有区别?这是怎么回事为什么元组的不可变性只在第一个片段中显示?
3条答案
按热度按时间hgb9j2n61#
这里有一个例子,希望它更容易理解:
字符串
当您编写
x[0] = something
时,脚本会在内存中找到x
所指向的值,并尝试修改它。但是当执行
x = something
时,脚本会在内存中创建一个新对象,并使x
指向该新对象。dddzy1tm2#
在您的示例中,
x
基本上只是对对象的引用。在第一个代码块中,您试图更改由x
表示的对象,它是一个元组。正如你正确地指出的,元组在Python中是不可变的,这意味着你不能直接改变元组中包含的项目。但是,您可以更改元组中的对象,只要对象仍然相同即可。字符串
在Python中,变量是弱类型的,这意味着你可以自由地用任何类型重新分配变量。例如,我们可以将字符串
"Hi World"
赋值给x
。xa9qqrwz3#
1.你正在修改对象x的现有行为,即元组
1.你覆盖一个现有的对象,并给予它一个新的定义/行为。通过重写i,意味着分配给现在分配给42的元组的x,并且由于x已经存在于存储器中,所以它重写现有行为,并且先前分配给的元组的值将由GC处理