关于python里的操作

例子1
a=1
b=0
for i in range(1):
a=b
b=a
print(a)
print(b)

输出的结果是
0
0

例子2
a=1
b=0
for i in range(1):
a,b=b,a
print(a)
print(b)
输出结果是:
0
1
我调试了几次有一点小明白,但是没接触过里面的原理,求帮忙点名知识点

我转载下网上说的比较明白的文章内容吧:

个人理解部分:总的来说python中所有变量都是保存引用地址的,不是直接保存值。然后

a,b=b,a这条代码对应python解释器解析后的是多条机器指令,它的执行顺序是先将右边的b,a的变量引用地址bb,aa加载出来,然后分别a指向bb,b指向aa,这样就完成了值的交换,

而不能简单的理解成先执行b=a,再执行a=b,两者是不同的

以下是转载截取:

Python的变量并不直接存储值,而只是引用一个内存地址,交换变量时,只是交换了引用的地址。

先看下面这段程序:

import dis
def func(a,b):
    a,b=b,a
    print(a,b)
a=10
b=20
func(a,b)
dis.dis(func)

一般来说一个Python语句会对应若干字节码指令,Python的字节码是一种类似汇编指令的中间语言,但是一个字节码指令并不是对应一个机器指 令(二进制指令),而是对应一段C代码,而不同的指令的性能不同,所以不能单独通过指令数量来判断代码的性能,而是要通过查看调用比较频繁的指令的代码来 确认一段程序的性能。 

一个Python的程序会有若干代码块组成,例如一个Python文件会是一个代码块,一个类,一个函数都是一个代码块,一个代码块会对应一个运行的上下文环境以及一系列的字节码指令。

dis的作用 

dis模块主要是用来分析字节码的一个内置模块,经常会用到的方法是dis.dis([bytesource]),参数为一个代码块,可以得到这个代码块对应的字节码指令序列。

代码输出结果 

其中只看前面为12的结果就行了(在我的编译器里,交换的那一行代码在第12行)

可以看出主要是ROT_TWO指令的功劳: 

查阅python文档可以知道有ROT_TWO (源码1398行),ROT_THREE(源码1406行), ROT_FOUR这样的指令,可以直接交换两个变量、三个变量、四个变量的值 

--------------------- 

作者:土豆洋芋山药蛋 

来源:CSDN 

原文:https://blog.csdn.net/qq_33414271/article/details/78522235 

版权声明:本文为博主原创文章,转载请附上博文链接!

追问

我想问一下为什么这个程序执行一次后就不执行了

温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-12-20
第一个a=b,所以a=0之后又b=a还是0
第二个相当于a,b交换值,在c语言中需要中间变量,在py中直接就可以交换。。追问

我想问一下为什么这个程序执行一次后就不执行了

追答

你在第二个for循环之后把a的值设为1了,py是根据缩进来划分代码块的

注意缩进。。。

第2个回答  2018-12-20
等式左边是一个值,右边用于赋值。赋值或者代码运算完毕之后,左边的值为最终的结果追问

我想问你一个问题,为什么这个程序执行一次后就不执行了

第3个回答  2018-12-20
犯错误隔海相望
相似回答