太久不写python,已经忘记以前学习的时候遇到了那些坑坑洼洼的地方了,开个帖子来记录一下,以供日后查阅。
摘要:一些报错;为啥Python没有自增 ++ 和自减 --;
0x01
字符串的单双引号问题:
Python不是JS,也不是Shell,单双引号在执行上没有任何差别。只不过字符串包含单(双)引号的手,包裹字符串的引号需要是双(单)引号。
0x02
含参数的脚本调用:
python filename.py arg1 arg2 ag3 ==> sys.argv # sys.argv == ["filename.py", "arg1", "arg2", "arg3" ]
0x03
"IndentationError: unindent does not match any outer indentation level" :
很有可能因为你在一行代码的缩进里面混着用了空格和tab -- 建议写代码之前把编辑器的tab缩进替换成四个空格,这样就永远不会出现“混着用空格tab”的问题了。
当然还有可能是你没对齐代码,比如本来用四个空格的缩进表示代码块,你有一部分代码块用的三个空格,也会报这个错。
0x04
"NameError: name 'n' is not defined":
针对input函数,这是一个Python2.7的报错。习惯了python3.x之后,我们不知道python2.x使用的 input() 函数和3.x使用的有所不同。
**2.7**
有两种 获取标准输入 的函数,他们分别是 "input()" 和 "raw_input()", 后者行为方式和现在使用的 input 函数相似,接受的所有内容均视为字符串,而前者则需要输入的时候符合编程规则,如下图所示
可以看出两种函数对不同输入的支持程度是不同的。
0x05
“SyntaxError: invalid character in identifier”:
他会具体给你标出来那里引发的这个问题,如下所示:
1 def test(user):
2 ^
3 SyntaxError: invalid character in identifier
你需要回到代码看看它标记出来的那个字符,你是不是用成了中文字符,这个问题尤其常见在冒号的使用上!
0x06
Python Linux编程学到的知识们 (脚本地址:https://www.cnblogs.com/jackablack/p/10717727.html)
1.Python 没有自增自减!一种解释是Python对待变量的逻辑类似于指针,它将被赋予相同值的变量指向了相同的id,我觉得还是有一些道理的,如下引用:
https://stackoverflow.com/questions/3654830/why-are-there-no-and-operators-in-python/3654973
My understanding of why python does not have++
operator is following: When you write this in pythona=b=c=1
you will get three variables (labels) pointing at same object (which value is 1). You can verify this by using id function which will return an object memory address:我针对为什么Python没有自增运算符的理解是这样的: 当你在Py里面写 a = b = c = 1的时候,你将会得到指向同一个对象(它的值为1)的三个变量(或称标签)。你可以通过使用 id() 函数来验证这一点,这个函数会返回一个对象的内存地址。
In [19]: id(a) Out[19]: 34019256 In [20]: id(b) Out[20]: 34019256 In [21]: id(c) Out[21]: 34019256
All three variables (labels) point to the same object. Now increment one of variable and see how it affects memory addresses:
上面三个变量都指向了同一对象,现在给其中某一个变量加上1,看一下它的内存地址发生了什么改变?
In [22] a = a + 1 In [23]: id(a) Out[23]: 34019232 In [24]: id(b) Out[24]: 34019256 In [25]: id(c) Out[25]: 34019256
You can see that variable
a
now points to another object as variablesb
andc
. Because you've useda = a + 1
it is explicitly clear. In other words you assign completely another object to labela
. Imagine that you can writea++
it would suggest that you did not assign to variablea
new object but ratter increment the old one. All this stuff is IMHO(In My Humble Opinion, 依我所见) for minimization of confusion.你可以发现,变量a相较于变量b和c,现在指向了另一个对象。原因显然是你给a加了1。换言之你是给标签a赋了另一个对象。现在假设你能在Py里面写自增,那么你得到的是对旧的对象的增加,而不是赋给另一个对象,这一切都是为了减少理解上的麻烦(使逻辑更清晰)。
2.python 脚本的执行,是在程序运行开始的时候确定的地址运行的,改换工作路径的方法是使用 os.chdir() 函数。使用 os.system("cd ./xxxx") 是无效的,它的有效期只有着一条命令而已,随着函数结束工作路径会回到函数开始的地址。