Python参考模型

时间:2014-10-28 19:09:54

标签: python

我很难理解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] ='垃圾邮件':我想知道python如何以这种方式修改可变对象(而不是创建一个新的字符串对象并链接变量b到该对象,不会影响L)指向的原始对象

感谢

3 个答案:

答案 0 :(得分:2)

ab都是对象的引用。

重新分配a时,您会更改哪个对象a正在引用。

当您重新分配b[0]时,您将重新分配 b中包含的其他参考。 b本身仍然引用它最初执行的相同列表对象,这也是传递给changer函数的列表。

答案 1 :(得分:0)

变量名称是指向特殊内存地址的指针,因此当您将LX传递给函数时,该函数不会创建a,b的新地址,只需更改标签!所以对它们的任何改变实际上都会改变X,L指向的那部分内存的值。因此,对于垃圾,你可以使用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])

答案 2 :(得分:0)

在Python中,列表是可变的,整数是不可变的。这意味着Python永远不会实际更改存储在内存中的整数的值,它会创建一个新的整数并将变量指向新的整数。

这样做的原因是使Python的动态类型工作。与大多数语言不同,您可以创建变量并在其中存储int,然后立即在其中存储字符串,或浮点数等。

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

这是动态类型语言的“特征”;)