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] = 'spam':我想知道Python是怎么以这种方式修改可变对象的(而不是创建一个新的字符串对象,并让变量b指向那个对象,这样就不会影响原本由L指向的对象)。
谢谢!
3 个回答
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])
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
a
和b
都是指向对象的引用。
当你重新给a
赋值时,你是在改变a
指向的对象。
而当你重新给b[0]
赋值时,你是在改变b
里面的一个引用。b
本身仍然指向最开始的那个列表对象,这个列表也是传递给changer
函数的。