Python 有什么不为人知的坑?
有啊,比如很著名的地址赋值:
>>> a = [[2] * 5] * 3
>>> a
[[2, 2, 2, 2, 2], [2, 2, 2, 2, 2], [2, 2, 2, 2, 2]]
>>> a[2][2] = 1
>>> a
[[2, 2, 1, 2, 2], [2, 2, 1, 2, 2], [2, 2, 1, 2, 2]]
>>>
这是因为当你赋值时变量存储的是内容地址,而不是真正的内容
还有,在存储字符串时,如果字符串里面有反斜杠“\”,那么会导致字符串不正确存储,甚至导致错误,比如:
>>> path = "C:\Users\admin"
File "<stdin>", line 1
path = "C:\Users\admin"
^^^^^^^^^^^^^^^^
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
>>>
其实这个错误很好解决,只需要:
>>> path = r"C:\Users\admin"
>>>
加上字符串前缀 r 即可
再比如,很多人一上手就想改编字符串指定索引的值:
>>> a = "hello"
>>> a[3] = "a"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>>
其实 str 并不支持根据指定索引赋值
再深入的讲就是 str 没有 __setitem__ 方法:
>>> hasattr(str, "__setitem__")
False
>>>
根据指定索引赋值的正确实现是:先转成列表,然后转成字符串:
>>> a = "hello"
>>> a = list(a)
>>> a
['h', 'e', 'l', 'l', 'o']
>>> a[3] = "a"
>>> print("".join(a))
helao
>>>
冷知识,最后的输出可以改成:
>>> print(*a,sep="")
helao
>>>
其实很多人都提到了,将函数传入参数时,不需要调用函数,即加上括号。比如:
def func(timestamp=time.time()):
print(timestamp)
这个是错的
import tkinter as tk
root = tk.Tk()
def on_button_click():
print("按钮被点击了!")
button = tk.Button(root, text="点击我", command=on_button_click())
root.mainloop()
这个也是错的
这是因为传入的参数应该是函数的引用,而不是函数的返回值