IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 浅析python ab=ba -> 正文阅读

[数据结构与算法]浅析python ab=ba

先看一组代码:python实现简单选择排序
基本思想:假设排序表为L[1…n],第i趟排序即从L[i…n]中选择关键字最小的的元素与L[i]交换,每一趟排序可以确定一个元素的最终位置,则经过n-1趟排序可以使得整个排序表有序。

实现代码1:

def func1(ls):
    for i, _ in enumerate(ls):
        ls[i], ls[ls.index(min(ls[i:]))] = ls[ls.index(min(ls[i:]))], ls[i]

实现代码2:

def func2(ls):
    for i, _ in enumerate(ls):
        ls[ls.index(min(ls[i:]))], ls[i] = ls[i], ls[ls.index(min(ls[i:]))]

代码似乎是一样的,只是交换的顺序变了而已,但是运行结果却不一样:

ls = [2, 4, 6, 1, 56, 3, 12]
func1(ls)
print(ls)
# [2, 4, 6, 1, 56, 3, 12]
ls = [2, 4, 6, 1, 56, 3, 12]
func2(ls)
print(ls)
# [1, 2, 3, 4, 6, 12, 56]

是不是到这里就很疑惑,为什么交换顺序却导致结果不一样?
查询得到:
a,b=b,a
右边的b,a会返回一个tuple,然后分别给a,b赋值tuple的第一个和第二个元素

a, b = 10, 20
c = b, a
print(c)
a, b = c
print(a, b)
# (20, 10)
# 20 10

不可变数据类型来说,交换元素位置对结果没有影响,但是对于可变数据类型来说却不一样,我们举个简单例子:

ls = [3, 4, 1, 5, 2]
c = ls[ls[1]], ls[1]
print("C:", c)
ls[1], ls[ls[1]] = c
print(ls[1], ls[ls[1]])
print(ls)

输出结果为:

C: (2, 4)
2 4
[3, 2, 4, 5, 2]

在ls[1], ls[ls[1]]=c的过程中,划重点:
首先赋值ls[1]=2,这时ls[1]已经改变了!所以ls[ls[1]]=4的时候修改的就是ls[2]了!
那么我们换一下交换顺序是否可以呢?

ls = [3, 4, 1, 5, 2]
c = ls[1], ls[ls[1]]
print("C:", c)
ls[ls[1]], ls[1] = c
print(ls[1], ls[ls[1]])
print(ls)

输出结果为:

C: (4, 2)
2 1
[3, 2, 1, 5, 4]

这样我们首先修改ls[ls[1]]就是ls[4]=4,然后再赋值ls[1]=2,结果正确!
这也就解释了为什么上面的交换排序两个方法输出结果不一样的原因!

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-24 09:40:34  更:2022-04-24 09:44:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:30:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码