Python可变/不可变和局部变量

2vuwiymt  于 2023-08-02  发布在  Python
关注(0)|答案(3)|浏览(125)

我对以下两个代码片段的行为差异感到非常困惑,特别是在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的主体的赋值中所采取的操作。
为什么会有区别?这是怎么回事为什么元组的不可变性只在第一个片段中显示?

hgb9j2n6

hgb9j2n61#

这里有一个例子,希望它更容易理解:

x = (1, 2)

def func1():
    x[0] = 42 # doesn't work

def func2():
    x = (3, 4, 5) # does work!

字符串
当您编写x[0] = something时,脚本会在内存中找到x所指向的值,并尝试修改它。
但是当执行x = something时,脚本会在内存中创建一个新对象,并使x指向该新对象。

dddzy1tm

dddzy1tm2#

在您的示例中,x基本上只是对对象的引用。在第一个代码块中,您试图更改由x表示的对象,它是一个元组。正如你正确地指出的,元组在Python中是不可变的,这意味着你不能直接改变元组中包含的项目。但是,您可以更改元组中的对象,只要对象仍然相同即可。

class Test123:
    abc = 10

a = Test123()
b = Test123()

print(a is b)
# --> False, as this is a different object and hence has a different identity

x = (a, )

# 1. Alter the tuple, doesn't work
x[0] = b
# --> Throws an error, as you're trying to change an immutable object

# 2. Alter the object within the tuple, works
x[0].abc = 123

# 3. Reassign x to another object, also works
old_x = x
x = (a, )

print(old_x is x)
# --> False, as old_x and x are not the same object (identity-wise)
print(old_x == x)
# --> True, as old_x and x are equal

字符串
在Python中,变量是弱类型的,这意味着你可以自由地用任何类型重新分配变量。例如,我们可以将字符串"Hi World"赋值给x

xa9qqrwz

xa9qqrwz3#

1.你正在修改对象x的现有行为,即元组
1.你覆盖一个现有的对象,并给予它一个新的定义/行为。通过重写i,意味着分配给现在分配给42的元组的x,并且由于x已经存在于存储器中,所以它重写现有行为,并且先前分配给的元组的值将由GC处理

相关问题