太久不写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 variablea
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") 是无效的,它的有效期只有着一条命令而已,随着函数结束工作路径会回到函数开始的地址。