LWN:对print()输出消息生成索引列表!

Linux内核之 printk 打印 Linux 内核之 printk 打印 阅读详情

关注了就能看到更多这么棒的文章哦~

printk() indexing

By Jonathan Corbet
May 27, 2021
DeepL assisted translation
https://lwn.net/Articles/857148/

当内核开发者想要看到关于运行中的内核状态的一些信息时,他们喜欢使用 printk()。这个操作就会生成一条 log entry 给人们阅读,但是有些成功有些不成功。其实,这些信息的最终处理者往往不是人类,内核的 log 会被那些希望发现问题的自动监控系统(monitoring system)读取。而实际情况经常工作得不太好,会出现监控系统错过重要信息的情况。printk() format indexing patch set 就是目前用来改善这种情况的众多尝试中最新的一种做法。

监控系统是由管理员安装的,用来在自己管理的系统出现问题时能及时发现。因此,比如说 CPU 突然起火了,而系统管理员并不在旁边,那么他们希望至少收到警报通知,从而他们知道应该先后给硬件供应商和消防部门打电话了。要发出这个警报的话,监控系统就需要观察内核日志中的相关代码所打印的 "CPU on fire" 这条消息。如果一切顺利的话,该信息将在 CPU 熔化之前就跳出来,管理员也可以及时开始订购系统来替换这个损坏的 CPU 了。

然后,有一天一位善意的小改动开发者出现了,他认为把消息的内容改成 "CPU in flames" 的话就会更有美感。在经过严格的 patch review 过程后,维护者正式合并了这个改动,并在 stable kernel update 中发布了出来。系统管理员在看到改进后的信息时,也会被 kernel 最新的这句话的美感深深地折服了。

但是,只有在管理员本人亲自看到这条消息时才会感受到这个美妙的改动。而不幸的是,监控系统仍然在寻找以前 "CPU on fire" 这条信息,它不仅不会被新的措辞所折服,而且还会完全错过这条消息。因此,它完全不会发出警报,系统管理员也就继续专心浏览他最喜欢的社交网站来进行美其名曰网络延迟测试的工作了,一直到喷淋器触发,一片混乱。到那时,已经来不及马上订购一个替换系统了,服务就会中断。

系统管理员非常讨厌看到这种情况。

问题是,虽然通过 printk() (以及其他基于 printk 的函数) 发出的信息会被用户空间的工具拿来分析,但这些消息从来不被认为是内核 ABI 的一部分,所以内核开发者认为可以随时改变(或删除)这些消息。这给那些创建了大量的正则表达式来检测感兴趣的信息的用户带来了麻烦,同时也阻碍了将提示信息翻译成其他语言的工作。

多年来,已经尝试过许多方法来解决这个问题。在 2011 年的内核峰会上,有一个激烈的讨论,是围绕着是否给每条内核消息添加一个 128 位的二进制 tag。这个想法跟其他所有类似的解决方案一样,都没能进入 mainline。很简单,内核社区从未觉得有必要对于通过 printk() 发布的 log 消息采用什么 struct 管理起来,这么做会耗费的额外功夫似乎完全不值得。

Chris Down 的最新提案中并未试图强制要求采用什么结构,相反,它只是收集了内核中所有的 printk()格式字符串,并通过 debugfs 中的一个文件把它们全部暴露出来。实现细节上来说,会把 printk() 改成一个 wrapper macro,其中会声明一个新的 structure 来保存格式信息。

struct pi_entry {
    const char *fmt;
    const char *func;
    const char *file;
    unsigned int line;
    const char *level;
    const char *pre_fmt;
    const char *post_fmt;
};

这个 structure 里面保存了传递给 printk() 的格式化字符串,以及 log level、位于源码中哪个位置,以及由各种 wrapper 函数(比如 dev_printk()函数)添加的 "pre" 和 "post "数据。这个结构会被放在编译好的 kernel 中的一个特殊 p(.printk_index)中。当然,这个 wrapper macro 还会调用原有的 printk()函数(现在叫_printk())来将消息打印输出。

在编译内核时,所有这些 pi_entry structure 都被放在了 .printk_index p 里。在 mount 了 debugfs 之后,管理员可以查看 printk/index/vmlinux 这个文件,其中包含了全部的格式。printk/index 下还针对每个 loadable module 也有对应的文件节点。查看这些包含数千个格式化字符串的文件,可能会像管理员的社交媒体新闻一样有趣,但这并不是正确的使用方法。相反,监控系统可以利用这些信息来确保他们所有的检查条件仍然与内核实际会生成的消息是相匹配的。如果 "CPU on fire" 这个检测条件不再匹配得上,那么要么 CPU 已经具备了防火能力,要么就是这条 log 信息已经被改过了。如果事实证明原因是后者的话,就可以相应地更新这个检查条件了。

截至本文写作时,在这个补丁集所经历的少量 review 中还没有被提出来多少问题,尤其是这几个我们比较关心的问题。第一个是:为什么这些信息需要放在内核中?它可以被放在一个单独的文件中,不需要占用系统运行时的内存。也许原因是这种机制可以使得内核在跨系统部署时也能保证提供了正确的格式字符串列表。

另一个问题是,debugfs 明确定义为不适合用在生产系统(production system)中,但这个功能看起来是要用于 production kernel 的。如果这个机制被纳入 mainline 的话,它可能必须得另找一个更加适合的位置,比如/sys。

不过,这个改动是否会被接受还有待观察。由于这个机制不需要内核开发者做任何额外工作,而且如果把相应的 config 关闭掉的话就完全不占用任何资源,因此可能比起以前那些为了改善 kernel log message 解析的方案遇到更少阻力。如果是这样的话,监控系统仍然会面临 kernel log message 发生意外变化的情况,但至少在这种时候能知道需要修改检测条件了。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

Linux内核调试核心技术:printk实战详解 在Linux内核开发中,printk是开发者最基础、最常用的调试工具之一。它类似于用户空间的printf函数,但专为内核态设计,用于在系统运行过程中输出关键调试信息。printk的基本语法如下:其中,KERN_INFO是消息的优先级宏,用于控制日志的输出级别。与用户态的printf不同,printk输出的内容不会直接显示在终端上,而是写入内核的日志缓冲区,可通过dmesg命令查看。相较于标准C库中的printfprintk具备以下特点:特性。 阅读详情

相关推荐

AutoCAD二次开发(.Net)之XData

对于CAD中的实体进行筛选等操作,常常会用到实体的XData属性,下面介绍一下实体的XData的增删改。 //XData的新增,修改跟新增一样,new一个ResultBuffer,赋值即可 Document doc=Application.DocumentManager.MdiActiveDocument; using (DocumentLock dl = doc.LockDocument()) { using (Transaction trans = doc.TransactionManager.S.

qq_21489689的博客 2592

LWN:5.15 合并周期后半部分!

关注了就能看到更多这么棒的文章哦~The rest of the 5.15 merge windowBy Jonathan CorbetSeptember 13, 2021DeepL as...

Linux News搬运工 448

思科—OSPF多区域配置实验

实验目的:配置OSPF多区域,使得不同网段的PC互相ping通。 网络拓扑如下: R0的配置 Router>en Router#conf t Router(config)#int g0/1 Router(config-if)#ip add 192.168.1.1 255.255.255.0 Router(config-if)#no shut Router(config-if)#exit Router(config)#int g0/0 Router(config-if)#ip add 192.168.

m0_46237205的博客 1万+

Linux Kernel Programming4

启用此功能后,本质上会发生以下情况:每个 printk实例的元数据 - 实际格式字符串(实际的消息)、其发出的源位置、日志级别等 - 都保存到一个结构(struct pi_entry)中,并且所有这些结构都整理到内核 vmlinux 映像中的特殊部分(名为 .printk_index;问题是,如果项目中有很多 printk 实例,那么保证项目中的所有成员始终一致且正确地遵循标准 printk 格式(例如,首先显示模块名称,然后显示文件名,然后显示函数名称,可能还有行号,如这里所示)可能会很麻烦。

charlie114514191的博客 1139

HTB_Bike靶机之模板注入

船到桥头自然直 文章目录信息收集模板引擎SSIT 模板注入后放答案 信息收集 日常 A 扫描,两个端口 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.4 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 3072 48:ad:d5:b8:3a:9f:bc:be:f7:e8:20:1e:f6:bf:de:ae (RSA) | 256 b7:89:6c:0b:20:ed:49:b2:c1:86:7c:.

网络安全学习 797

告别龟速计算!用Python的fengwo模块5分钟搞定通达信COST/WINNER函数(附完整代码)

本文介绍如何使用Python的fengwo模块高效复现通达信的COST和WINNER函数,解决量化交易中的计算精度和性能问题。通过C++核心算法和多线程优化,计算速度提升显著,误差低于0.5%,并支持与通达信DLL无缝集成,适用于实盘交易策略开发。

weixin_42533751的博客 599

LWN:5.19 合并窗口第一部分!

关注了就能看到更多这么棒的文章哦~5.19 Merge window, part 1By Jonathan CorbetMay 27, 2022DeepL assisted translationhttps://lwn.net/Articles/896140/在撰写本文时,针对 5.19 开发周期,已经有将近 4600 个 non-merge changeset 合入 m...

Linux News搬运工 543

二极管钳位电路、限幅电路和检波电路Multisim电路仿真

本文系统介绍了二极管钳位、限幅和检波三种基础电路的工作原理及Multisim仿真验证。钳位电路通过电容-二极管配合实现波形整体平移,将波峰或波谷固定在指定电压;限幅电路利用二极管导通特性削除信号超出设定阈值的部分;检波电路则通过半波整流和电容滤波从调幅波中提取音频信号。三种电路均通过Multisim仿真验证了理论分析结果,展示了二极管在信号处理中的关键作用。这些基础电路广泛应用于信号调理、电平保护和通信解调等领域。

XU157303764的博客 1119

python中的索引

字符、列表、元组、字典、集合的一些笔记

AgostoDu的博客 5514

LeRobot 官方论文:一个用于端到端机器人学习的开源库

本文介绍了一个名为LeRobot的开源库,旨在解决机器人学习领域的碎片化问题。该库提供了端到端的技术栈,包括统一的机器人中间件API、标准化的数据集格式(LeRobotDataset)、优化的推理栈以及多种最先进机器人学习算法的实现。LeRobot支持多种低成本开源机器人平台(如SO-10X、ALOHA-2等),通过共享中间件实现便捷的遥操作和数据收集。其数据集格式已广泛应用于社区,截至2025年9月已有16,000多个数据集公开共享。该库还支持流式处理大规模数据,降低了研究门槛。在模型方面,LeRobot

2506_90492529的博客 904

在Simulink中构建感应电机的时滞补偿控制模型,并通过仿真验证不同补偿策略的有效性

核心优势Smith预估器可有效补偿已知时滞,提升系统稳定性。动态PID调整适用于时变时滞的初步补偿。扩展方向自适应时滞估计:结合Luenberger观测器实时估计时滞。鲁棒控制:引入H∞控制或滑模控制抑制参数不确定性。网络化时滞补偿:结合知识库[2]的网络延迟模型,实现端到端补偿。

amy_mhd的博客 189

【LINUX】pr_info函数开发摸索

pr_info_self这里也可以扩展,不过这里的语法比较复杂,什么斜杠,fmt,双引号什么的,修改代码的时候要注意。2、打印次数,当前代码里边写的是1000次,其实可以根据传参动态修改打印日志次数,不过没有开发,只是大概展示了下;

1497

[ vulhub漏洞复现篇 ] ActiveMQ反序列化漏洞复现(CVE-2015-5254)

Apache ActiveMQ是美国阿帕奇(Apache)软件基金会所研发的一套开源的消息中间件,它支持Java消息服务、集群、Spring Framework等。由于ActiveMQ是一个纯Java程序,因此只需要操作系统支持Java虚拟机,ActiveMQ便可执行。Apache ActiveMQ 5.13.0之前5.x版本中存在安全漏洞,该漏洞源于程序没有限制可在代理中序列化的类。......

qq_51577576的博客 4444

dmesg&printk&console的工作原理

内核调试者对DMESG应该不会感到陌生,DMESG可以将内核打印信息输出到控制台,从而让我们知道内核发生了什么。一句话不足以概括其中的工作细节,那么,DMESG是如何发挥作用的呢,这里我们就探究一下。

tugouxp的专栏 3836

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

python--列表索引 index---列表查询print---获取的是单个字符

给我一个元素:我可以获得指定元素的索引 给我一个索引 可以获得元素

weixin_47295886的博客 521

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Linux kernel的调试技术

内核中的调试支持 内核开发者在内核中建立了很多调试功能。但是这些调试功能会造成额外的输出,并且导致性能下降,因此发行版厂商通常会禁止发行版内核中的这些功能。但是作为一名内核开发者,调试需求具有更高优先级,从而乐意接受额外的调试支持而带来的性能损失。 这里列出内核开发的几个配置选项,除特殊指出,所有这些选项均出现在“kernel hacking”菜单。并非所有体系架构都支持其中的某些选线。更多的调试功可能查看lib/Kconfig.debug文件,或者在menuconfig中搜索关键字debug。 CO

jinchengzhou的专栏 1653

内核调试信息printk/pr_debug()/dev_dbg()

内核调试信息printk/pr_debug()/dev_dbg()

2833

python获取指定元素索引

python获取指定元素索引,查询一个list或者array中某个元素所在的位置索引,也就是行列号。

kingjsp2016的博客 6576

Python学习笔记(4):列表的使用

列表可以一次性存储很多数据,是一种有序的数据类型。例如:mylist = []创建一个列表,只要把逗号分隔的不同数据项使用方括号括起来即可比如:list = [1,'hello',3.14,3000] 运行结果:列表索引从0开始,也可以倒着开始,-1表示倒数第一个,-2表示倒数第二个。 运行结果:与字符串切片类似。语法为list[start:end],表示从start开始,到end的前一个结束(不包含end)。也可以省略,start省略表示从头开始,end省略表示到结尾。 运行结果: list.

a789865315的博客 3264

linux驱动调试之Debugfs

linux的debugfs原理以及使用方法介绍

weixin_37620587的博客 3988

Linux之debugfs介绍

Linux之debugfs介绍 Debugfs是一种用于内核调试的虚拟文件系统,在内核源码中经常可以看到它的使用,今天我来大概介绍一下它的使用。 如果你对debugfs不熟悉,那么也许你会对sysfs比较熟悉,对于调试方面,其实两个文件系统还是挺类似的,但是sysfs的引入内核主要是用于驱动模型的。所以我们在平时调试的时候应该尽量避免使用sysfs,而使用debugfs。 好了,下面我们来介

技术无捷径,一步一脚印 2801

Python如何打印文字对应的索引

用python编写一个简单的小程序:将文字对应的索引打印出来。 test=input('>>>') print(test) l=len(test) print(l) r=range(l) for item in r: print(item,test[item]) 以上为了练习步骤繁琐,下面程序比较简单。 test=input('>&gt...

weixin_34168880的博客 1239

python列表打印指定元素的索引

https://blog.youkuaiyun.com/orangefly0214/article/details/81387077

qq_41810188的博客 4350

python索引

python

qq_42307546的博客 3888

如何打印出python多维列表中的某一列

在python中,普通的列表list和numpy中的数组array是不一样的,最大的不同是:一个列表中可以存放不同类型的数据,包括int、float和str,甚至布尔型;而一个数组中存放的数据类型必须全部相同,int或float。 ​ 在list中的数据类型保存的是数据的存放的地址,简单的说就是指针,并非数据,这样保存一个list就太麻烦了,例如list1=[1,2,3,4]需要4个指针和四

manjhOK的博客 2万+
上一篇: LWN:Pallets项目集的新版本!
下一篇: LWN: 用eBPF实现seccomp()
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值