1.配置环境
使用环境:python3.7 平台:Windows10 IDE:PyCharm
2.博客由来
博主在做链表题目算法题时发现了一个有趣的现象。经过一段时间的分析博主更深入理解了Python中的赋值语句,记录在此博客中。如果你也遇到同样的问题或许这篇文章可以对你有所启发。
3.问题提出
首先请问大家一个问题,一下代码的运行结果应该是多少?
首先直接上代码
class List_Node:
def __init__(self, val=0):
self.val = val
if __name__ == '__main__':
a = List_Node(1)
b = a
b.val = 10
print(a.val)
可能会有不少同学认为是1 ,但是实际的输出结果却是10
4.问题分析
对于上面的例子,我们很快可以想到另一个例子,代码如下
c = 1
d = c
d = 10
print(c)
那么这个结果应该是多少呢? 答案是1 我们不禁思考,这是为什么呢? 先把结论告诉大家 Python在进行赋值运算时,是将= 右边变量(a)的内存地址共享给= 左边变量(b),那么= 左边变量(b)如果改变内存中的内容,那么会引起= 右边变量(a)的改变。
我们可以通过观察变量的地址来验证这一问题,代码如下
class List_Node:
def __init__(self, val=0):
self.val = val
if __name__ == '__main__':
a = List_Node(1)
b = a
b.val = 10
print(a.val)
print("ID: a:%d\nID: b:%d"%(id(a),id(b)))
运行结果如下:
那么,对于实数赋值:
c = 1
d = c
d = 10
print(c)
为什么d 的改变没有引起c 的改变呢? 这是因为d 的改变是通过赋值语句改变的,d 在执行d = 10 这一语句时,它指向的内存就已经和c 分离了,我们同样可以通过查看内存的方式来验证
c = 1
d = c
print("执行 d = c")
print("ID: c:%d\nID: d:%d"%(id(c),id(d)))
d = 10
print(c)
print("执行 d = 10")
print("ID: c:%d\nID: d:%d"%(id(c),id(d)))
再次总结一下: Python在进行赋值运算时,是将= 右边变量(a)的内存地址共享给= 左边变量(b),那么= 左边变量(b)如果改变内存中的内容,那么会引起= 右边变量(a)的改变。
5.小问题
最后,提出一个小问题供大家思考:
class List_Node:
def __init__(self, val=0):
self.val = val
if __name__ == '__main__':
a = List_Node(1)
b = List_Node(10)
a.val = b.val
b.val = 5
print(a.val)
请问上面代码的运行结果是多少呢?
6.结束语
如果本文对你有帮助的话还请点赞、收藏一键带走哦,你的支持是我最大的动力!(づ。????。)づ
|