我很难理解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)指向的原始对象
感谢
答案 0 :(得分:2)
a
和b
都是对象的引用。
重新分配a
时,您会更改哪个对象a
正在引用。
当您重新分配b[0]
时,您将重新分配 b
中包含的其他参考。 b
本身仍然引用它最初执行的相同列表对象,这也是传递给changer
函数的列表。
答案 1 :(得分:0)
变量名称是指向特殊内存地址的指针,因此当您将L
和X
传递给函数时,该函数不会创建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
这是动态类型语言的“特征”;)