Python特殊list [...]

本文介绍如何使用Python创建循环链表,并通过示例代码解释其工作原理。文章详细解析了不同方式下列表引用与循环结构的形成过程。

C 和C++中创建一个循环链表很简单,可是Python呢?

上代码:

a = []
a[:] = [a]

看似简单的一段代码,可是理解起来可不简单了。先看结果:

print(a)
[[...]]

ok,问题已经抛出,[[...]]这个东西是啥?

先看属性:

id(a) == id(a[0])

True

id(a) == id(a[0][0])

True

a[1]

IndexError: list index out of range

好吧,废话不多说,开始直接讲结果:

a[:] 等价于 import copy;copy(a),就是浅拷贝,不懂的同学自行百度吧。

首先先来个定义,id(a) 是list_id, id(a[n])是data_point即list 内容指针指向

那么a[:]指向的是list内容data_point

data_point = [a] 结果就很明显,a的内容指像了一个新的list,list的data_point指回了自己,即最小链表

那么 a[:] = a呢?

因为 data_point = list_id,那这个就尴尬了,因为list_id为空,所以结果只能是一个list[]

那 a = [0];a[0] = [a]呢,其实原理一样

很明显,a的data_point[0] 的内容指向了一个列表,列表的data_point 又指向自己,所以结果成了[[[...]]]

 

讲解结束,list内部结构可以参考Python源码。下面给出几种可以形成[[...]]的方式:

1,a = []; a[:] = [a]

2,   a = [0];a[0] = a

3,   a = [];a.append(a)

### Python `random.shuffle` 函数的使用方法 #### 1. 功能概述 `random.shuffle()` 是 Python 的标准库 `random` 提供的一个函数,用于将可变序列(如列表)中的元素随机重新排列。该函数会 **原地修改** 输入的序列,因此不会返回新的对象[^3]。 #### 2. 参数说明 `random.shuffle(x[, random])` 接受两个参数: - `x`: 待打乱顺序的可变序列(通常是列表)。如果传入的是不可变类型(如元组),则会抛出错误。 - `random`: (可选)自定义伪随机数生成器,默认情况下使用内置的 `random.random()` 方法。 #### 3. 示例代码 以下是几个典型的使用场景: ##### 示例 1: 基本用法 ```python import random original_list = [1, 2, 3, 4, 5] random.shuffle(original_list) print(original_list) # 输出可能为 [3, 1, 5, 2, 4], 结果每次运行都不同 ``` 此示例展示了如何对一个简单的整数列表进行随机排序[^3]。 --- ##### 示例 2: 自定义随机种子 为了实现可重复的结果,可以设置固定的随机种子: ```python import random seed_value = 42 random.seed(seed_value) data = ['apple', 'banana', 'cherry'] random.shuffle(data) print(data) # 输出固定结果,例如 ['banana', 'cherry', 'apple'] ``` 通过指定相同的种子值,无论程序运行多少次,都会得到一致的随机化结果[^1]。 --- ##### 示例 3: 应用于数据集划分 在机器学习项目中,常需将数据划分为训练集和测试集。以下是一个具体例子: ```python import random dataset = list(range(1, 11)) # 创建一个包含数字 1 到 10 的列表 random.shuffle(dataset) # 将数据随机打乱 split_point = int(len(dataset) * 0.7) # 训练集占总数据量的 70% training_set = dataset[:split_point] testing_set = dataset[split_point:] print("Training Set:", training_set) print("Testing Set:", testing_set) ``` 这段代码演示了如何利用 `random.shuffle()` 对数据进行预处理并分割成两部分[^2]。 --- ##### 示例 4: 处理复杂结构的数据 对于嵌套列表或其他更复杂的输入形式,需要注意其行为特性: ```python import numpy as np complex_data = [ {"a": 1}, [{"b": 2}, {"c": 3}], [{"d": 4}] ] shuffled_data = np.random.permutation(complex_data).tolist() print(shuffled_data) # 子数组内部保持原有顺序,仅外层被打乱[^5] ``` 这里借助 NumPy 实现了一种扩展功能,适用于某些特殊需求下的随机重排。 --- #### 4. 注意事项 - 如果尝试对不可变类型的变量调用 `shuffle()`,将会引发异常。例如: ```python tuple_data = (1, 2, 3) random.shuffle(tuple_data) # TypeError: 'tuple' object does not support item assignment ``` - 默认情况下,`shuffle()` 修改的是原始对象本身,而不是创建副本。如果希望保留初始状态,则应先复制一份再操作。 --- #### 5. 总结 综上所述,`random.shuffle()` 是一种高效便捷的方法来完成各种涉及随机性的任务,比如游戏开发、模拟实验以及数据分析等领域均能发挥重要作用[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值