Python 参考模型

1 投票
3 回答
771 浏览
提问于 2025-04-30 05:42

我很难理解Python的引用模型。

def changer(a,b):
    a = 2
    b[0] = 'spam'  
X = 1
L = [1,2] 
changer(X,L)  
X,L
(1,['spam',2])

我有个问题,关于赋值b[0] = 'spam':我想知道Python是怎么以这种方式修改可变对象的(而不是创建一个新的字符串对象,并让变量b指向那个对象,这样就不会影响原本由L指向的对象)。

谢谢!

暂无标签

3 个回答

0

变量名其实是指向特定内存地址的指针,所以当你把 LX 传递给一个函数时,函数并不会创建一个新的地址来存放 a,b,它只是改变了标签而已!这意味着对这些变量的任何修改,实际上都是在改变 XL 指向的那部分内存的值。为了避免这种情况,你可以使用 copy 模块:

>>> from copy import copy
>>> def changer(a,b):
...     i = copy(a)
...     j = copy(b)
...     i = 2
...     j[0] = 'spam'
... 
>>> X = 1
>>> L = [1,2] 
>>> changer(X,L) 
>>> X,L
(1, [1, 2])
0

在Python中,列表是可以改变的,而整数是不能改变的。这意味着Python不会真的去改变存储在内存中的整数值,而是会创建一个新的整数,然后把变量指向这个新的整数。

这样做的原因是为了让Python的动态类型能够正常工作。和大多数编程语言不同,你可以先创建一个变量并把一个整数放进去,然后立刻再把一个字符串或者浮点数放进去。

MyVariable = 10     # This creates an integer and points MyVariable at it.
MyVariable = "hi"   # Created a new string and MyVariable now points to that.
MyVariable = 30     # Created a new integer, and updated the pointer

所以在你的代码中发生的事情就是这样的:

MyVar = 1   # An integer is created and MyVar points to it.

def Increase(num):
   num = num + 1   #A new integer is created, the temp variable num points at it.

Increase(MyVar)
print(MyVar)    # MyVar still points to the original integer

这就是动态类型语言的一种“特性”哦;)

2

ab都是指向对象的引用。

当你重新给a赋值时,你是在改变a指向的对象。

而当你重新给b[0]赋值时,你是在改变b里面的一个引用。b本身仍然指向最开始的那个列表对象,这个列表也是传递给changer函数的。

撰写回答