关于 Python 的 import

好久以前就被 Python 的相对与绝对导入所困扰。去年粗浅探究后自以为完全理解,近来又因 sys.path[0]os.getcwd() 的不一致而刷新了认知...

Python 官方文档 5. The import system — Python 3.10.5 documentation 当然是最好的学习指南,但全部看完对我来说还是有点难度。这里只选择一些要点讨论。

from import

import Aimport A as Bfrom A import B 结构中,A 最小只能到 module。因此,只有使用 from import 结构才可以单独获取 module 里的属性。另外,相对引用必须使用 from import 结构。

from module import * 将导入 module 中的所有成员(有单双下划线前导的成员除外)。对于 package 可在 __init__.py 中定义 __all__ = ["module", "module", ...] 来手动控制的实际导入内容。

Package 与 __init__.py

Python 3.3 以后的 package 不再硬性需要 __init__.py,普通文件夹等同于 __init__.py 留空的 namespace package。(关于 regular package 和 namespace package 的区别,参见 5. The import system — Python 3.10.5 documentation)

__init__.py 的作用在于当我们直接导入一个 package 的时候,实际上是执行了 __init__.py。换句话说,直接导入一个 package 就是把它看做一个逻辑写在 __init__.py 里的 module。

需要注意的是,对于形如 A.B.C 的导入,AA.BA.B.C 对应的 __init__.py 都会被执行。也就是说,只要导入路径经过该 package,该 package 的 __init__.py 就会被执行。

Submodules

When a submodule is loaded using any mechanism (e.g. importlib APIs, the import or import-from statements, or built-in __import__()) a binding is placed in the parent module’s namespace to the submodule object. For example, if package spam has a submodule foo, after importing spam.foo, spam will have an attribute foo which is bound to the submodule.

...

Given Python’s familiar name binding rules this might seem surprising, but it’s actually a fundamental feature of the import system. The invariant holding is that if you have sys.modules['spam'] and sys.modules['spam.foo'] (as you would after the above import), the latter must appear as the foo attribute of the former.

— 5. The import system — Python 3.10.5 documentation

这是说,import 进来的 module 会被挂载到本 module 上作为其属性。

这个性质可以弄出来很多看上去很奇怪的玩意儿,比如说自己导入自己后可以 me.me.me.me... 无限嵌套之类的...


另外,对于形如 import A.B.C 的导入,AA.BA.B.C 都会被挂载到本 module 上。然而,from A.B import C 却只会挂载 C,而 import A.B.C as D 也只会挂载 D ,即使 AA.B 都被执行且都在 sys.modules 里。

sys.path

A list of strings that specifies the search path for modules. Initialized from the environment variable PYTHONPATH, plus an installation-dependent default.

As initialized upon program startup, the first item of this list, path[0], is the directory containing the script that was used to invoke the Python interpreter. If the script directory is not available (e.g. if the interpreter is invoked interactively or if the script is read from standard input), path[0] is the empty string, which directs Python to search modules in the current directory first. Notice that the script directory is inserted before the entries inserted as a result of PYTHONPATH.

A program is free to modify this list for its own purposes. Only strings and bytes should be added to sys.path; all other data types are ignored during import.

— sys — System-specific parameters and functions — Python 3.10.5 documentation

sys.path 是 Python 搜索 module 的基准目录(即绝对导入)。其由环境变量 PYTHONPATH 和一些默认路径(和安装环境有关,参见 PYTHONHOME)组成,而在运行 script 时,script 的所在目录会被临时加入 sys.path[0]。如果运行的并不是 script(例如是交互式运行或从 stdin 中读取脚本代码),sys.path[0] 则被设置为空字符串,代表当前工作目录

sys.path 有优先级,排在前面的优先级高。


需要特别注意的是,script 的所在目录不是当前工作目录。例如,在 D:\test 下执行

python path/to/file.py

时,sys.path[0]D:\test\path\to\file.py,而当前工作目录则是 D:\test(也即 os.getcwd())。

当前工作目录是 Python 寻找其他文件时的基准路径,而所有绝对导入操作都只与 sys.path 有关,两者是完全不同的。

python -m 的情况稍有不同,参见后文。

python -m

Search sys.path for the named module and execute its contents as the __main__ module.

Since the argument is a module name, you must not give a file extension (.py). The module name should be a valid absolute Python module name, but the implementation may not always enforce this (e.g. it may allow you to use a name that includes a hyphen).

Package names (including namespace packages) are also permitted. When a package name is supplied instead of a normal module, the interpreter will execute <pkg>.__main__ as the main module. This behaviour is deliberately similar to the handling of directories and zipfiles that are passed to the interpreter as the script argument.

Note

This option cannot be used with built-in modules and extension modules written in C, since they do not have Python module files. However, it can still be used for precompiled modules, even if the original source file is not available.

If this option is given, the first element of sys.argv will be the full path to the module file (while the module file is being located, the
first element will be set to "-m"). As with the -c option, the current directory will be added to the start of sys.path.

-I option can be used to run the script in isolated mode where sys.path contains neither the current directory nor the user’s site-packages directory. All PYTHON* environment variables are ignored, too.

Many standard library modules contain code that is invoked on their execution as a script. An example is the timeit module:

python -m timeit -s 'setup here' 'benchmarked code here'
python -m timeit -h # for details

Raises an auditing event cpython.run_module with argument module-name.

See also

runpy.run_module()

Equivalent functionality directly available to Python code

PEP 338 – Executing modules as scripts

Changed in version 3.1: Supply the package name to run a __main__ submodule.

Changed in version 3.4: namespace packages are also supported

— 1. Command line and environment — Python 3.10.5 documentation

sys.path 指定的目录中寻找 module 并以 __main__ module 的身份执行指定 module。

注意不要在名字后面加 .py,因为我们已经把执行的文件当作 module 来看待。

如果指定的是一个 Package name(即目录名),将会执行 <pkg>.__main__(即 <pkg>/__main__.py)。

另外,如果使用 python -m a.b.modulesys.argv 的首位将被设置为被执行 module 文件的完整路径(与之相对,python a/b/module.pysys.argv[0] 将会是相对当前工作目录的路径,即 a/b/module.py);同时,当前工作目录会被加入 sys.path 的首位。


python -m A.B.module 将顺次执行 AA.B__init__.py,即使该 module 没有任何导入行为。

python -m 对于直接执行 package 内部的代码是必要的。若直接以 script 方式运行,一旦涉及到任何高于该 script 所在目录(含该目录)的相对导入,Python 就会抛出如下错误:

ImportError: attempted relative import with no known parent package

而一个 module 也不能导入超过 python -m 参数指定的最顶层结构的 module,否则会抛出错误:

ImportError: attempted relative import beyond top-level package

sys.modules

The first place checked during import search is sys.modules. This mapping serves as a cache of all modules that have been previously imported, including the intermediate paths. So if foo.bar.baz was previously imported, sys.modules will contain entries for foo, foo.bar, and foo.bar.baz. Each key will have as its value the corresponding module object.

During import, the module name is looked up in sys.modules and if present, the associated value is the module satisfying the import, and the process completes. However, if the value is None, then a ModuleNotFoundError is raised. If the module name is missing, Python will continue searching for the module.

sys.modules is writable. Deleting a key may not destroy the associated module (as other modules may hold references to it),
but it will invalidate the cache entry for the named module, causing Python to search anew for the named module upon its next
import. The key can also be assigned to None, forcing the next import of the module to result in a ModuleNotFoundError.

Beware though, as if you keep a reference to the module object, invalidate its cache entry in sys.modules, and then re-import the named module, the two module objects will not be the same. By contrast, importlib.reload() will reuse the same module object, and simply reinitialise the module contents by rerunning the module’s code.

— 5. The import system — Python 3.10.5 documentation

sys.modules 是一个 dict,Python 在导入之前会去检查 sys.module 里是否已经存有需要的 module 的 module object。如果有,就直接用这个;如果值为 None(意思是以前找过但没找到),就直接报错;如果该键值对不存在,就继续搜索过程。总之,sys.modules 扮演了一个类似 cache 的角色。

对于形如 A.B.C 的导入,Python 会顺次导入 AA.BA.B.C 并把他们加入 sys.modules

参考

  • 5. The import system — Python 3.10.5 documentation

  • 6. Modules — Python 3.10.5 documentation

  • Python for the Lab | Complete Guide to Imports in Python: Absolute, Relative, and More

  • Python 包内的导入问题(绝对导入和相对导入) - Anonymous596 - 博客园

本文转载于网络 如有侵权请联系删除

相关文章

  • 期末考试快到了,如何快速批量制作试卷填空题?

    1、点击[替换]2、点击[查找内容] 3、点击[更多]4、点击[格式]5、点击[字体]6、点击[无颜色]7、点击[红色]8、点击[确定]9、点击[替换为]10、点击[格式]11、点击[字体]12、点击[无颜色] 13、点击[白色,背景1]14、点击[下划线线型]15、点击[横线]16、点击[无颜色]17、点击[黑色,文字1] 18、点击[确定]19、点击[全部替换]20、点击[确定]

  • 敲代码用什么显示器好?

    一块合适的显示器对程序员写代码来说非常重要。 那么,程序员敲代码和普通用户码字用的显示器有什么区别、该如何选择呢?来看看不同段位程序员的建议。记笔记:4k能启动4合1的像素点渲染,这个时候字体大小和精细度都最佳。记笔记:带鱼屏是开多窗口编程需求下最经济、方便、高效的选择。最经济,比两台16:9的显示器更省钱;最方便,多窗口切换时操作自然;最高效,窗口之间没有间隙,无缝结合,占用桌面空间少。记笔记:1尺寸:27寸以上;2分辨率:4k,2K也能用,1080P就有点不合适了;3面板:毫无疑问IPS最舒服;4接口:接口丰富,这样适配的机器多,自己用的时候不担心适配问题;5品牌:个人认为别买杂牌,质量没保证;6其他:一定要有防蓝光,不然受伤的是自己的眼睛;一定要有升降,符合人体工程学。最近其他有意思的文章: 中文也太博大精深了吧 到底什么是元宇宙

  • AngularJS 动画

    AngularJS提供了动画效果,可以配合CSS使用。AngularJS使用动画需要引入angular-animate.min.js库。<scriptsrc="http://cdn.static.runoob.com/libs/angular.js/1.4.6/angular-animate.min.js"></script>复制还需在应用中使用模型ngAnimate:<bodyng-app="ngAnimate">复制什么是动画?动画是通过改变HTML元素产生的动态变化效果。实例勾选复选框隐藏DIV:<bodyng-app="ngAnimate"> 隐藏DIV:<inputtype="checkbox"ng-model="myCheck"> <divng-hide="myCheck"></div> </body>复制应用中动画不宜太多,但合适的使用动画可以增加页面的

  • EndNote这几个技能,让你大大提高文献管理效率

    EndNote是文献管理利器,如果你都不知道使用以下几个操作技巧,那么我怀疑你在用一个假的文献编辑器!赶紧跟着小通一起实践看看吧!设置标签 给文章做一个标记,找起来又快又准 ◆◆◆▍随着使用时间增长,相信每个人的EndNote库中文章都越来越多;除了给文章分组之外,给文章设置一个标签可以进一步的提高管理效率。比如,有的文章图标做的漂亮,有的文章句子优美。。。总之,这些文章都可能是日后需要再翻阅的。启用Label栏将Label栏拖拽到左侧Reference处给文章设置标签设置好标签后,是不是更快的知道该文章的亮点了PDF附件统一管理 PDFHanding设置 ◆◆◆▍给文献关联PDF附件是最常用的功能了,但是当你需要更换电脑用EndNote库,如果你发现PDF关联PDF都失效了,那说明你没有设置好附件关联设置哦点Edit-Preferences选中Author+Year+tile这样PDF会按选中的格式重命名重命名效果并且会将其统一复制到MyEndNoteLibrary.Data文件夹内这意味着,需要换一台电脑使用EndNote库时将这个两个文件拷贝过去就可以无缝对接了 批量下载PDF

  • Android 天气APP(三十一)每日提醒弹窗

    效果图每日提醒弹窗前言正文一、弹窗背景二、每天第一次弹窗三、弹出每日提示弹窗四、弹窗的开关文末前言  为了增强用户的体验,所以增加了这个每日弹窗,每日弹窗顾名思义,每天弹出一次,就不再弹窗,当然如果用户觉得烦的话,可以在弹窗中勾选上不再弹窗,或者在应用设置中,关闭每日弹窗都是可以的。下面来写这个功能。正文  说到弹窗我就想起来我之前的应用更新弹窗那一篇文章了,那么这个功能怎么来写呢?其实也不难,首先想清楚这个弹窗要什么东西。①是弹窗的背景,我希望每一天都不一样,那么就可以采用必应的每日一图。 ②弹窗可关闭不再弹出,可以通过缓存的方式判断处理, ③弹窗上面显示的值,可以通过主页面其它接口先获取到返回值,然后在弹窗中显示, ④每日只弹出一次,这个就是要在每日弹出弹窗时,存储一个时间戳缓存,后面再进入APP时判断时间大小就可以了。这么一看,目标就明确了,下面进入实操环节。一、弹窗背景  还记得之前我在写壁纸页面的时候,把必应的请求放到壁纸管理页面了,那么主页面就没有请求了,而我又需要这个请求获取每日的壁纸url。所以在欢迎页面新增了一个请求。打开SplashContract,新增如下代码:

  • MyBatis启动之XMLConfigBuilder解析配置文件(二)

    前言XMLConfigBuilder是BaseBuilder(解析中会涉及到讲解)的其中一个子类,它的作用是把MyBatis的XML及相关配置解析出来,然后保存到Configuration中。本文就解析过程按照执行顺序进行分析,掌握常用配置的解析原理。使用调用XMLConfigBuilder进行解析,要进行两步操作,上篇文章中【MyBatis之启动分析(一)】有提到。实例化XMLConfigBuilder对象。privateXMLConfigBuilder(XPathParserparser,Stringenvironment,Propertiesprops){ //调用父类的构造方法 super(newConfiguration()); ErrorContext.instance().resource("SQLMapperConfiguration"); this.configuration.setVariables(props); this.parsed=false; this.environment=environment; this.parser=parse

  • Flask-状态保持-CSRF

    问题:cookies基于浏览器的同源策略,不同域名的cookie不能相互访问,为什么可以进行跨站请求伪造呢?原因:cookie基于浏览器的同源策略,确实是在实现状态保持的时候,不能跨域访问。跨站请求的伪造过程:是其他网站伪造访问原网站的请求,导致的一系列信息泄露。具体伪造过程: 如何防止CSRF的过程呢,还是需要通过一系列双向验证来保证:在用户请求服务器的时候,服务器向cookie中写入csrf_token,浏览器的form表单中也会写入csrf_token,在浏览器进行下一次请求的时候,服务端会取到这两个token进行比对,一致就能验证是用户自己访问,不一致,就会存在伪造风险。在客户端向后端请求界面数据的时候,后端会往响应中的cookie中设置csrf_token的值在Form表单中添加一个隐藏的的字段,值也是csrf_token在用户点击提交的时候,会带上这两个值向后台发起请求后端接受到请求,以会以下几件事件:从cookie中取出csrf_token从表单数据中取出来隐藏的csrf_token的值进行对比如果比较之后两值一样,那么代表是正常的请求,如果没取到或者比较不一样,代表不是

  • 天天算法 LeetCode-112-路径总和

    题目链接https://leetcode-cn.com/problems/path-sum/题目描述给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。说明:叶子节点是指没有子节点的节点。示例:给定如下二叉树,以及目标和sum=22,5 /\ 48 //\ 11134 /\\ 721复制返回true,因为存在目标和为22的根节点到叶子节点的路径5->4->11->2。 -------------------机智的思考线------------------- -------------------机智的思考线-------------------- -------------------机智的思考线------------------- 解题方案思路标签:深度优先遍历递归终止条件:当前节点为null时返回false当前节点为根节点时且路径和等于目标和则返回true递归过程:不断判断判断左右子树注意点:这里涉及到短路问题,也就是当发现了某一条路径和满足条件时,就应该结束递归,故而下面的

  • 全球首个 广东联通打通5G手机电话

    摘要:广东联通宣布,近日联合中兴通讯,在深圳5G规模测试外场,打通了全球第一个基于3GPP最新协议版本的5G手机外场通话(FirstCall)。广东联通表示,此次5G手机外场通话,率先通过无线方式实现了5G手机终端与网络成功对接,在5G网络下运行了微信、视频等应用,对5G商用进程意义重大。据悉,本次测试采用了遵循3GPP2018年9月30日协议版本的核心网、传输承载网、无线网到终端的5G端到端解决方案,现网验证了大规模天线阵列、5G新空口、NSA双连接模式、FlexE传输技术、全NFV虚拟化核心网等最新关键技术。其实在此之前,已经有多家厂商创造了多个不同的“首个5G通话”,比如2017年4月,美国Verizon联合韩国电信KT通过5G网络接通了全球首个5G全息国际电话;2018年4月,中兴、中国移动打通国内首个基于3GPPR15标准的5G电话;2018年6月,中国移动打通全球首个5G独立组网端到端系统全息通话;2018年10月,高通联合爱立信成功拨通第一个5G电话;2018年11月,OPPO打通全球首个5G手机微信视频通话,中兴首次在仿真系统下实现5G上网和5G微信收发……联通此番特别

  • 在tensorflow中安装并启动jupyter的方法

    博主遇到一个问题,在anaconda中安装并配置好tensorflow和opencv后,直接输入jupyternotebook复制启动jupyternotebook在jupyternotebook中输入命令,如importtensorflow并不能调用tensorflow的开发包。原因是:如果此时直接启动jupyter,此时的jupyter是基于整个anaconda的python,而不是对应的tensorflow虚拟环境,因此进入此虚拟环境后需要重新安装jupyternotebook。输入命令:/bin/bash ./bin/activate sourceactivatetensorflow复制进入虚拟环境以后,输入命令:condainstalljupyter复制直到安装包下载完成,在tensorflow目录下就安装了jupyter,此时在tensorflow虚拟环境下,输入命名:jupyternotebook复制此时就可以调用tensorflow和opencv的库,如下图:

  • 装饰器

    一。关于装饰器:定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能原则:1.不能修改被装饰函数的源代码2.不能修改被装饰函数的调用方式二.实现装饰器知识必备技能:1.函数即“变量”2.高阶函数a.把一个函数名当做实参传给另外一个函数(在不修改被装饰函数源代码下为其添加功能)b.返回值中包含函数名(不修改函数的调用方式)3.嵌套函数高阶函数+嵌套函数=》装饰器2.1函数即“变量”(一切皆对象)在python中,一切皆对象,变量是对象,函数是对象,类是对象,所有的一切都是对象。如下图所示,这里定义函数func,于是内存中就开辟属于func的内存空间,写入func的函数功能。随后在解释器上输入func函数的函数名,这时会返回一串指针地址,在python中所有的对象都会对应的指针地址,即指向内存中func函数的位置。如果在func函数名后加上(),这就说明func根据指针地址调用了func函数。2.2高阶函数变量可以指向函数,函数的参数能接受变量,那么一个函数可以接受另一个函数作为参数,这种函数称为高阶函数。如图定义func函数有x,y,f三个参数,执行func函数时将实参abs传形

  • iSlide2022免费版PPT插件功能详情介绍

    为你节省90%的PPT设计时间!iSlide专门针对PPT编辑过程中的问题,通过功能、模板及课程学习的方式,帮助用户做出改变,更高iSlide下载最新安装包末尾文章查阅嵌入集成PPT/WPS软件功能菜单即装即用,与PPT/WPS软件无缝对接,下载模板直接插入PPT/WPS演示文档;简单快捷,会使用PPT就能使用iSlide,节约学习成本iSlide下载最新安装包末尾文章查阅三端产品应用,满足不同工作场景iSlide产品包含桌面端(插件)、移动端(App/小程序)以及网页端应用,同一账号可以在不同产品端使用,会员权益共享客户端PPT设计辅助功能,无需联网,离线可用8大PPT在线资源库,模板素材一键插入统一字体将当前PPT文档中的字体一键替换为指定的中英文字体,并且在PPT中插入文本框或在占位符中输入中英文字符时,自动对应,保持统一的阅读识别。统一段落PPT中1.0倍的默认行距是根据英文字符定义的规则不适合中文多文本时的排版和阅读。统一段落功能可以将当前PPT文档中的文本一键统一为指定的行距和段前段后距。统一色彩将当前PPT文档中使用的非“主题颜色”全部识别并列出,统一替换为“主题颜色”中

  • 前端开发之CSS样式——自定义滚动条

    如何使用CSS创建自定义滚动条准备工作做好了,接下来进入本教程中有趣的部分。本节内容的第一部分会介绍一些滚动条样式相关的CSS属性。第二部分我们会实现4种不同类型的滚动条,能为你之后制作自己的滚动条提供一些思路。滚动条样式相关的CSS属性很不幸,现在还没有对这些CSS属性的标准化跨浏览器支持。Firefox和一些基于Webkit内核的浏览器(如Chrome、Edge、Safari)各自提供了不同的属性。本教程主要针对Webkit内核的浏览器,因为它们提供了更多样式属性,不过我也会简单介绍一下Firefox。Webkit滚动条样式属性::-webkit-scrollbar–整个滚动条::-webkit-scrollbar-track–滚动条的滚动区域(轨道)::-webkit-scrollbar-thumb–滚动条的可拖拽部分(滑块)以下是可用但不常用的属性:::-webkit-scrollbar-button–滚动条两端的上/下(或左/右)按钮::-webkit-scrollbar-track-piece–滚动条轨道未被滑块覆盖的部分::-webkit-scrollbar-corner

  • 面试题29.数组中出现次数超过一半的数字

    题目:数组中有一个数字出现的次数超过数组长度的一半,请找出整个数字。例如 输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在整个数组中出现5次, 超过数组长度的一半,输出2.   此题的解法有很多种,剑指offer书中提出了两种,一种是Parition的方法,另外 一种是计数的方法。   这里我们用计数的方法来实现一下。试想当我们遍历数组的时候用一个计数器。 当遇到相同的数时计数器加1,遇到不同的数计数器减1,然而数组中有数字超过数 组长度的一半,则肯定计数器最后的值是大于等于1,所以超过一半的数肯定是使 计数器最后一次设为1的数字。     代码如下: 1#include<iostream> 2usingnamespacestd; 3 4intFindNumberMuchHalf(intarray[],intlength) 5{ 6if(array==NULL||length<=0) 7return0; 8 9intresult=array[0]; 10intcount=1; 11 12for(int

  • 使用 C# 9.0 新语法提升 if 语句美感

    C#语言一贯秉承简洁优美的宗旨,每次升级都会带来一些语法糖,让我们可以使代码变得更简洁。本文分享两个使用C#9.0提升if语句美感的技巧示例。 使用属性模式代替IsNullOrEmpty 在任何你使用IsNullOrEmpty的时候,可以考虑这样替换: string?hello="helloworld"; hello=null; //旧的方式 if(!string.IsNullOrEmpty(hello)) { Console.WriteLine($"{hello}has{hello.Length}letters."); } //新的方式 if(hellois{Length:>0}) { Console.WriteLine($"{hello}has{hello.Length}letters."); } 复制 属性模式相当灵活,你还可以把它用在数组上,对数组进行各种判断。比如判断可空字符串数组中的字符串元素是否为空或空白: string?[]?greetings=newstring[2]; greetings[0]="Helloworld"; greetings=null;

  • javascript:;与javascript:void(0);

    href=”#”,包含了一个位置信息,默认的锚是#top,也就是网页的上端,当连续快速点击此链接时会导致浏览器巨慢甚至崩溃。 javascript中void是一个操作符,该操作符指定要计算一个表达式但是不返回值。   javascript:void(0);据说某些情况下有浏览器兼容bug。(此点bug我也不知道什么时候能出现,知道的童鞋请指教)。 我感觉这两者之间没有什么差别,都是执行一个空事件。javascript:;甚至少了7个字符。   新浪微博写的都是javascript:void(0); QQ空间一部分写的上面那种,一部分又写成javascript:;,对于这点,有点强迫症的我感觉很不舒服:-O。

  • mac pro电脑怎么安装rabbitmq

    p.p1{margin:0;font:11pxMenlo;color:rgba(0,0,0,1)} span.s1{font-variant-ligatures:no-common-ligatures} 第一:依次执行以下命令: 1. /usr/bin/ruby-e"$(curl-fsSLhttps://raw.githubusercontent.com/Homebrew/install/master/install)" 2. brewupdate 3. brewinstallerlang 4. brewinstallrabbitmq   第二:增加环境变量:   在.bash_profile文件中增加: p.p1{margin:0;font:11pxMenlo;color:rgba(0,0,0,1)} span.s1{font-variant-ligatures:no-common-ligatures} PATH=$PATH:/usr/local/sbin     再运行命令: source.bash_

  • 黑 马 程 序 员_视频学习总结&lt;C语言&gt;----03 指针

     ----------------------ASP.Net+Unity开发、.Net培训、期待与您交流!----------------------   一、什么是指针? 用来存放变量地址的变量,就称为"指针变量"。   二、指针的定义 一般形式:类名标识符  *指针变量名; int*p; float*q;复制 "*"是一个说明符,用来说明这个变量是个指针变量,是不能省略的,但它不属于变量名的一部分 前面的类型标识符表示指针变量所指向的变量的类型,而且只能指向这种类型的变量   三、指针的初始化 1.指针的初始化有:先定义后初始化、在定义的同时初始化 2.初始化的注意 指针变量是用来存放变量地址的,不要给它随意赋值一个常数。下面的写法是错误的 int*p; p=200;//这是错误的复制   四、指针运算符 1.给指针指向的变量赋值以及内存分布 1chara=10; 2printf("修改前,a的值:%d\n",a); 3 4//指针变量p指向变量a 5char*p=&a; 6

  • FIM相关报错汇总

    1、错误1:FIM在修改MA名字的时候报错: Themanagementagentcannotbedeletedorrenamedbecausetheworkingdirectoryisinuse. 可能的原因可能是“C:\ProgramFiles\MicrosoftForefrontIdentityManager\2010\SynchronizationService\MaData\<MA对应的名字>”路径下: a、文件夹被占用(修改名称的时候,对应的文件夹也会被修改名称),解决方法:使用进程查看器查看是谁占用了该文件夹。 b、找不到这个文件夹:解决方法,新建一个空文件夹并于MA同名,然后再次修改该MA的名称。   2、错误2:一运行MA的FULLIMPORT就导致整个FIM服务重启。 目前没有特别好的解决方法,疑似FIM2010版本存在bug,清除对应的CS,重新FULLIMPORT。

  • html中input提示文字样式修改

    在很多网站上我们都看到input输入框显示提示文字,让我们一起来看看如果在input输入框中显示提示文字。我们只需要在<input>标签里添加:placeholder="提示文字即可",那么如果要修改提示文字的样式呢?可以这样设置css样式: <!DOCTYPEhtml> <html> <head> <metacharset="UTF-8"> <title>input输入框提示文字</title> <style> /*修改提示文字的颜色*/ input::-webkit-input-placeholder{/*WebKitbrowsers*/ color:red; } input:-moz-placeholder{/*MozillaFirefox4to18*/ color:red; } input::-moz-placeholder{/*MozillaFirefox19+*/ color:red; } input:-ms-input-placeholder{/*InternetExplor

  • 软件著作权申请 — 源代码格式化

    大学时写过软件版权申请,当时用到的一款源代码格式化的软件很不错,工作后再用到,在百度搜索“软著源代码格式化软件”却很难找到,在此做个记录。   软件名:source2Pdf.exe 官网链接:https://www.xasumao.cn/products-SoftwareCopyrightApplication.html 相关文档: (1)超详细软件著作权申请——资料篇 (2)超详细软件著作权申请——流程篇  

相关推荐

推荐阅读